ASP.NET Application_Error被调用两次

时间:2011-07-11 15:53:23

标签: asp.net asp.net-mvc-3 error-handling

我使用Application_Error来处理ASP.NET MVC 3应用程序中的错误。今天我注意到,对于一个特定的错误情况,这个方法被调用两次:当请求带有前导下划线的资源时,例如_ViewStart.cshtml

Application_Error的实现会消耗最后一次服务器错误:

var exception = server.GetLastError();
server.ClearError();
...

因此,当第二次调用时,GetLastError会返回null。当它第一次被调用时,它会在响应对象上设置相应的状态代码和内容。然后第二次调用导致所有这些设置被覆盖。要解决此问题,我现在检查空指针:

if (exception == null) return;

这样,它完全正常工作:该方法的第一次运行将错误页面替换响应并设置状态代码。第二轮没有任何作用。然后将响应发送给获取正确状态代码和错误页面的客户端。

但这行代码对我来说很脏。我宁愿理解发生了什么,而不是让错误处理程序静默退出,而事实上肯定会出现问题。

请注意:在第一次运行错误处理期间,似乎没有任何异常被抛出。否则我能理解它。但是在逐行调试时,会处理整个Application_Error方法,包括对控制器的MVC调用和视图的呈现。实际上,在遵循gordonml的注释并检查“抛出CLR异常时断开”标志之后,Visual Studio确实从未中断,甚至在第一次调用Application_Error之前也没有。

2 个答案:

答案 0 :(得分:0)

同样的事情发生在我身上。

我的解决方案如下(我不喜欢它,但我比if(exception == null) return;更喜欢它

如果在对服务器的AJAX调用中抛出异常,我只是删除了Response.StatusCode = (int)401

我在Global.asax.cs中有这个,因为有时,API访问令牌比http会话早到了。如果我设置Response.StatusCode = 500,则Application_Error不会触发两次。

答案 1 :(得分:0)

Web.config中有两种可能性来定义自定义错误。确保只有其中一个存在,否则相应的错误被调用两次。

<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
  <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
  ...
</httpErrors>


<customErrors mode="On">
  <error redirect="~/Error/NotFound" statusCode="404" />
  ...
</customErrors>