Elmah: Как получить тело HTTP-запроса JSON из отчета об ошибке - PullRequest
15 голосов
/ 31 декабря 2011

Я использую 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"}

Ответы [ 3 ]

19 голосов
/ 05 января 2012

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

4 голосов
/ 08 декабря 2013

сначала установите пакет 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));
}
1 голос
/ 30 мая 2012

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

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

...