ELMAH:如何从错误报告得到JSON HTTP请求正文ELMAH:如何从错误报告得到JSON HT

2019-05-12 05:31发布

我使用ELMAH来记录异常。 ELMAH是在日志请求机构巨大的,如果该请求是基于表单的请求(即内容类型:应用程序/ x-WWW的形式,进行了urlencoded),但基于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"}

Answer 1:

ELMAH到目前为止仅记录是外围的请求,并可以以一种标准的方式来方便地拍摄到的上下文的信息。 形式,可以说是一个特殊的处理,因为ASP.NET已经做解码的工作,并要求识记时的实体的MIME类型application/x-www-form-urlencoded 。 在另一方面JSON请求是prolematic因为在发生异常时,输入流( HttpRequest.InputStream )可能已被部分或完全地由一个解码器JSON消耗。 ELMAH将无法在其获得第二裂缝进行日志记录的目的。 因此,你必须确保你将其通过任何JSON解码器前缓冲输入流或文本和藏匿它什么地方像HttpContext.Items 。 然后,您可以尝试恢复缓冲数据和它在一个错误的时间附加到外发邮件 。 ELMAH目前不支持任意的数据附加到一个记录的错误。 然而,有是ErrorLogModule具有Logged事件并提供了记录的错误的ID。 这可以用来存储输入数据的其他地方(也许在另一个表,如果您使用的是后端数据库的错误日志),而是通过保持通过标识关联比分扳成回记录的错误。



Answer 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));
}


Answer 3:

继与Atif的答案在这里,有一个方法添加额外的细节ELMAH日志通过手动抛出一个新的异常。 这不是特别优雅,但它似乎做的工作!

我很感兴趣地听到从他本人的任何评论......



文章来源: Elmah: How to get JSON HTTP request body from error report