我使用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"}
ELMAH到目前为止仅记录是外围的请求,并可以以一种标准的方式来方便地拍摄到的上下文的信息。 形式,可以说是一个特殊的处理,因为ASP.NET已经做解码的工作,并要求识记时的实体的MIME类型application/x-www-form-urlencoded
。 在另一方面JSON请求是prolematic因为在发生异常时,输入流( HttpRequest.InputStream
)可能已被部分或完全地由一个解码器JSON消耗。 ELMAH将无法在其获得第二裂缝进行日志记录的目的。 因此,你必须确保你将其通过任何JSON解码器前缓冲输入流或文本和藏匿它什么地方像HttpContext.Items
。 然后,您可以尝试恢复缓冲数据和它在一个错误的时间附加到外发邮件 。 ELMAH目前不支持任意的数据附加到一个记录的错误。 然而,有是ErrorLogModule
具有Logged
事件并提供了记录的错误的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的答案在这里,有一个方法添加额外的细节ELMAH日志通过手动抛出一个新的异常。 这不是特别优雅,但它似乎做的工作!
我很感兴趣地听到从他本人的任何评论......