Elmah: Как получить тело запроса JSON HTTP из отчета об ошибке

Я использую Elmah для регистрации исключений. Elmah отлично подходит для регистрации органов запроса, если запрос является запросом на основе формы (то есть Content-Type: application / x-www-form-urlencoded), но с запросами на основе JSON, где типом контента является application / json, тело запроса нигде не встречается в отчетах об ошибках. Кто-нибудь знает, где я могу найти этот орган запроса, чтобы я мог правильно диагностировать мои исключения?

ОБНОВЛЕНИЕ: 2012-01-03

В качестве пояснения к тому, что я имею в виду под JSON-запросами, вот пример необработанного HTTP-запроса с JSON в качестве тела запроса:

PUT http://mycompany.com/api/v1.0/me HTTP/1.1 Host: mycompany.com Content-Length: 20 Content-Type: application/json {"city":"Vancouver"} 

ELMAH пока только регистрирует контекст или информацию, которая является периферийной для запроса, и которая может быть удобно захвачена стандартным образом. Формы, возможно, являются особым методом, потому что ASP.NET уже выполняет работу по декодированию и запоминанию объектов запроса, когда тип MIME является application/x-www-form-urlencoded . Запросы JSON, с другой стороны, пролематичны, потому что в то время, когда возникает исключение, входной stream ( HttpRequest.InputStream ) может быть частично или полностью потреблен декодером JSON. ELMAH не смог бы получить вторую трещину с целью регистрации. Поэтому вам необходимо убедиться, что вы буферизируете входной stream или текст, прежде чем передавать его через любой JSON-декодер и спрятать его где-нибудь как HttpContext.Items . Затем вы можете попытаться восстановить буферизованные данные и прикрепить их к исходящей почте во время ошибки . В настоящее время ELMAH не поддерживает прикрепление произвольных данных к зарегистрированной ошибке. Однако существует ErrorLogModule , в котором Logged событие, и которое ErrorLogModule идентификатор зарегистрированной ошибки. Это можно использовать для хранения входных данных в другом месте (возможно, в другой таблице, если вы используете базовую базу данных для журналов ошибок), но привяжите ее к зарегистрированной ошибке, поддерживая ассоциацию через Id.

сначала установите пакет nuget: Newtonsoft.Json

 install-package Newtonsoft.Json 

тогда:

  public override void OnException(HttpActionExecutedContext filterContext) { var message = new StringBuilder(); foreach (var param in filterContext.ActionContext.ActionArguments) { message.Append(string.Format("{0}:{1}\r\n", param.Key, Newtonsoft.Json.JsonConvert.SerializeObject(param.Value))); } var ex = new Exception(message.ToString(), filterContext.Exception); var context = HttpContext.Current; ErrorLog.GetDefault(context).Log(new Error(ex, context)); } 

В дополнение к ответу Атифа, здесь есть способ добавить дополнительные данные в журнал ELMAH , вручную выбросив новое исключение. Это не особенно элегантно, но, похоже, это делает работу!

Мне было бы интересно услышать какие-либо комментарии от самого человека …

Interesting Posts

Surround в Windows 7 с Soundmax

Установка Ubuntu на виртуальном ПК Windows 7

Безопасно ли использовать ноутбук без батареи?

Могу ли я поделиться своим кабельным интернет-подключением через мой беспроводной маршрутизатор ADSL?

Утилиты семантического разрыва

Как сделать программу (файл .exe) видимой при поиске из меню «Пуск»

Как обновить веб-приложение Tomcat без перезапуска всей службы?

Найти и заменить блок текста (другими блоками текста) в нескольких файлах

Текст размыт на внешнем дисплее обычного DPI с дисплеем для ноутбука Windows 8.1 и ноутбука с высоким разрешением

Синтаксис сахара: _ * для лечения Seq как параметры метода

Шаблоны для обработки пакетных операций в веб-службах REST?

Как получить значение из последней вставленной строки?

Где находится клиент удаленных рабочих столов OS X

Отображение текста под графиком, созданным ggplot2

Как отправить объект JSON через Request с Android?

Давайте будем гением компьютера.