我使用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之前也没有。
答案 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>