15

我正在使用 Elmah 记录异常。如果请求是基于表单的请求(即 Content-Type: application/x-www-form-urlencoded),Elmah 擅长记录请求正文,但对于内容类型为 application/json 的基于 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"}
4

3 回答 3

19

到目前为止,ELMAH 仅记录请求外围的上下文或信息,并且可以以标准方式方便地捕获。表单可以说是一种特殊处理,因为当MIME类型为application/x-www-form-urlencoded. 另一方面,JSON 请求是多方面的,因为在发生异常时,输入流 ( HttpRequest.InputStream) 可能已部分或完全被 JSON 解码器消耗。为了伐木,ELMAH 无法对其进行第二次破解。因此,您必须确保在将输入流或文本通过任何 JSON 解码器之前对其进行缓冲,并将其存储在HttpContext.Items. 然后,您可以尝试恢复缓冲的数据并出错时将其附加到外发邮件中。ELMAH 目前不支持将任意数据附加到记录的错误中。然而ErrorLogModule,有一个Logged事件并提供记录的错误的 Id。这可用于将输入数据存储在其他地方(如果您使用后端数据库存储错误日志,则可能存储在另一个表中),但通过通过 Id 维护关联将其与记录的错误联系起来。

于 2012-01-05T10:53:29.287 回答
4

first install nuget package : Newtonsoft.Json

install-package Newtonsoft.Json

then:

 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));
}
于 2013-12-08T18:37:36.913 回答
1

除了 Atif 在此处的回答之外,还有一种方法可以通过手动抛出新异常来向 ELMAH 日志添加其他详细信息。它不是特别优雅,但似乎可以完成这项工作!

我很想听听这个人本人的任何评论......

于 2012-05-29T22:42:02.547 回答