【问题标题】:ASP.NET Application_Error being invoked twiceASP.NET Application_Error 被调用两次
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    在您的 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>
    

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 2014-07-12
      • 2016-04-01
      • 2012-05-05
      • 2017-01-19
      • 2014-02-04
      • 2016-12-13
      • 2016-01-30
      相关资源
      最近更新 更多