Elmah:如何从错误报告中获取JSON HTTP请求正文

时间:2011-12-31 05:18:46

标签: c# .net elmah error-logging exception-logging

我正在使用Elmah记录异常。如果请求是基于表单的请求(即Content-Type:application / x-www-form-urlencoded),Elmah非常擅长记录请求主体,但是基于JSON的请求,其中内容类型是application / json,请求正文在错误报告中找不到任何地方。任何人都知道我在哪里可以找到这个请求主体,以便我可以正确诊断我的异常?

更新:2012-01-03

作为对基于JSON的请求的含义的澄清,这是一个以JSON作为请求主体的示例原始HTTP请求:

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

{"city":"Vancouver"}

3 个答案:

答案 0 :(得分:19)

到目前为止,ELMAH仅记录请求外围的上下文或信息,并且可以以标准方式方便地捕获。表单可以说是一种特殊的处理方式,因为当MIME类型为application/x-www-form-urlencoded时,ASP.NET已经完成了解码和记忆请求实体的工作。另一方面,JSON请求是原始的,因为在发生异常时,输入流(HttpRequest.InputStream)可能已被JSON解码器部分或完全消耗。为了记录,ELMAH无法获得第二次破解。因此,您必须确保在将输入流或文本传递给任何JSON解码器之前缓冲输入流或文本,并将其存放在像HttpContext.Items这样的地方。然后,您可以尝试恢复缓冲的数据attach it to an outgoing mail at the time of an error。 ELMAH当前不支持将任意数据附加到记录的错误。但是ErrorLogModule有一个Logged事件,它提供了记录错误的ID。这可以用于将输入数据存储在别处(如果您使用后端数据库作为错误日志,可能在另一个表中),但通过Id维护关联将其重新绑定到记录的错误。

答案 1 :(得分:4)

首先安装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));
}

答案 2 :(得分:1)

除了Atif在这里的回答之外,还有一种方法可以通过手动抛出一个新的异常来add additional details to ELMAH log。它不是特别优雅,但它似乎做了这个工作!

我有兴趣听到这个男人本人的任何评论......