我已经为ASP.NET编写了HttpModule,它将检查当前异常(如果有)并将其包装在具有唯一标识符的新异常中。然后,我希望Elmah记录该包装异常。
我的模块正在运行并且位于Elmah模块的前面,但是我无法解决如何更改Server.GetLastError()以便记录新异常的情况!
我尝试过:
var originalException = context.Server.GetLastError();
var app = (HttpApplication)sender;
var context = app.Context;
context.ClearError();
context.AddError(new WrapperException(originalException));
但是这样做会使context.Error属性返回null。
实际上,ClearError并没有做广告宣传的事情:"Clears all errors for the current HTTP request."
它不会这样做。 AllErrors数组仍然包含异常。所有这些都会使GetLastError返回null。
您不能设置context.AllErrors,也不能在数组中戳东西(它是副本)。
您也不能引发新异常:错误页面仅看到原始异常,而Elmah甚至没有记录它。
我开始认为这是不可能的。
答案 0 :(得分:1)
如果要替换Server.GetLastError()
的唯一原因是要确保ELMAH记录正确的异常,则可能有更好的方法。 ELMAH的过滤功能可用于覆盖记录的异常。为此,请将以下代码添加到您的Global.asax.cs
文件中:
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
{
var httpContext = args.Context as HttpContext;
ErrorLog.GetDefault(httpContext).Log(new Error(new WrapperException(args.Exception)));
args.Dismiss();
}
在将任何未捕获的异常记录到已配置的错误日志之前,ELMAH会调用ErrorLog_Filtering
方法。在示例中,我提取了有关发生的错误的信息(args.Context
和args.Exception
),并将抛出的异常包装在新的异常(WrapperException
)中。通过使用ErrorLog.GetDefault(...).Log(...)
方法记录新的异常,可以确保ELMAH不会递归调用ErrorLog_Filtering
方法(如果您使用ErrorSignal...Raise()
,则可以)。最后,我消除了原始异常,以避免两次记录错误。