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

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

更新: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"} 

到目前为止,ELMAH仅记录请求外围的上下文或信息,并且可以以标准方式方便地捕获。 表单可以说是一种特殊的处理方式,因为当MIME类型为application/x-www-form-urlencoded时,ASP.NET已经完成了解码和记忆请求实体的工作。 另一方面,JSON请求是示例性的,因为在发生exception时,输入流( HttpRequest.InputStream )可能已被JSON解码器部分或完全消耗。 为了记录,ELMAH无法获得第二次破解。 因此,您必须确保在将输入流或文本传递给任何JSON解码器之前缓冲输入流或文本,并将其存放在HttpContext.Items之类的某处。 然后,您可以尝试恢复缓冲的数据,并在发生错误时将其附加到外发邮件 。 ELMAH当前不支持将任意数据附加到记录的错误。 但是, ErrorLogModule有一个Logged事件,它提供了记录错误的Id。 这可用于将输入数据存储在其他位置(如果您使用后端数据库作为错误日志,可能在另一个表中),但通过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)); } 

继Atif的回答之后,有一种方法可以通过手动抛出一个新的Exception 来为ELMAH日志添加更多细节 。 它不是特别优雅,但它似乎做了这个工作!

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