是否可以更改Server.GetLastError()返回的值?

时间:2019-01-24 05:05:41

标签: c# asp.net elmah httpmodule

我已经为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甚至没有记录它。

我开始认为这是不可能的。

1 个答案:

答案 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.Contextargs.Exception),并将抛出的异常包装在新的异常(WrapperException)中。通过使用ErrorLog.GetDefault(...).Log(...)方法记录新的异常,可以确保ELMAH不会递归调用ErrorLog_Filtering方法(如果您使用ErrorSignal...Raise(),则可以)。最后,我消除了原始异常,以避免两次记录错误。