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"}
Ответы
Ответ 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, вручную выбросив новое исключение. Это не особенно элегантно, но, похоже, делает эту работу!
Мне было бы интересно услышать любые комментарии от самого человека...