我们有一个配置为使用ELMAH的ASP.NET MVC 3应用程序。我们在Application_Error方法中也有这样的代码。 ELMAH和我们的自定义代码都记录到数据库中。
protected void Application_Error(object sender, EventArgs e)
{
MvcApplication app = (MvcApplication)sender;
HttpContext httpContext = app.Context;
Exception ex = app.Server.GetLastError();
HttpException httpException = ex as HttpException;
//log the error with our custom logging
Server.ClearError();
if (httpContext.IsCustomErrorEnabled) //only show custom error if enabled in config
{
httpContext.Response.Clear();
httpContext.ClearError();
//show our own custom error page here
}
}
我们看到的问题(不是真正的问题,但无论如何)是ELMAH和我们的自定义代码都将DB的异常记录下来。我希望调用Server.ClearError()和httpContext.ClearError会处理错误,它永远不会到达ELMAH。但是,错误被记录两次的事实是否意味着ELMAH和application_error基本上并行运行并且它们同时收到未处理的异常?如果是这样,那么告诉ELMAH忽略错误?
我们的意图是只有ELMAH处理错误才会出现错误,例如在注册elmah之后的ASP.NET管道中,但是在MVC应用程序运行之前。
答案 0 :(得分:4)
问题是它首先登录到ELMAH。所以是的,你可以告诉它不要使用e.Dismiss()
登录ELMAH:下面的ErrorLog_Filtering
函数在Application_Error
之前被命中。因此,添加此函数以及确定是否需要ELMAH所需的任何逻辑。
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
//get the exceptions like:
Exception m = e.Exception;
Exception ex = e.Exception.GetBaseException();
//tell it not to log the error in ELMAH like (based on whatever criteria you have):
e.Dismiss();
//Application_Error will be hit next
}
protected void Application_Error(object sender, EventArgs e)
{
//your logic
}