Подтвердить что ты не робот

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"}
4b9b3361

Ответ 1

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

Ответ 2

сначала установите пакет 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));
}

Ответ 3

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

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