【发布时间】:2011-10-02 22:24:19
【问题描述】:
我使用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 之前也没有中断。
【问题讨论】:
-
它可能是作为辅助请求的结果而被调用的,例如请求页面上的另一个元素或 favicon.ico。您可以通过转到 Visual Studio 中的“调试”菜单并单击“异常”来强制调试器中断所有异常。从那里您可以检查“抛出”的“公共语言运行时异常”。这将捕获任何线程 AFAIK 上引发的所有异常。
-
@gordonml:事实并非如此。这两次 Application_Error 调用发生在处理一个请求的过程中。两次调用都具有相同的响应对象,因此第二次调用可以丢弃第一次调用写入响应中的任何内容。
-
这个运气好吗? @chiccodoro 我也有同样的问题。
-
@cacho - 很抱歉,这是很久以前的事了,不记得了。虽然如果我找到答案,我可能会在这里更新。
标签: asp.net asp.net-mvc-3 error-handling