我正在使用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"}
答案 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。它不是特别优雅,但它似乎做了这个工作!
我有兴趣听到这个男人本人的任何评论......