Global.asax中的Application_Error事件未在IIS7中触发,但在IIS6中正常工作

时间:2015-04-02 12:47:25

标签: asp.net asp.net-mvc-5 iis-7.5 iis-6 global-asax

去年,我们将Web应用程序迁移到了新服务器。以下是移动前的系统/应用程序配置规范:

  • Windows Server 2003
  • IIS 6.0
  • ASP.NET 4.0
  • 的WebForms

以下是移动到新服务器后的规范:

  • Windows Server 2008
  • IIS 7.5
  • ASP.NET 4.5.1
  • WebForms / MVC 5混合(感谢VS 2013)

问题在于,由于移动导致环境发生剧烈变化,Global.asax中的Application_Error事件不再像之前一样触发。我在这方面遇到了很多问题(参见本期末),但没有一个解决方案可行。它们也很老,所以我认为SE应该有关于这个主题的一些更新答案。

我想做什么:

如果抛出特定异常,我想导航到特定的错误页面。否则,按照我的web.config中的定义进入error.aspx。自移动以来,我没有对web.config或代码进行任何更改。这是Application_Error事件:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)

    If TypeOf (Server.GetLastError) Is System.Web.HttpRequestValidationException Then
        NavigateToErrorPage("Display special error message here")
    End If

End Sub
web.config中的

customErrors

<customErrors mode="RemoteOnly" defaultRedirect="error.aspx" />

那么我需要做些什么才能使我的应用程序在IIS 7.5中的行为与在IIS 6中的行为相同?

编辑:我注意到在localhost下本地运行我的应用程序时会触发Application_Error事件。

我发现的其他问题无法在这里帮助我:

Application_Error event global.asax not getting triggered

global.asax Application_Error not firing

Application_Error not firing when customerrors = "On"

Is global.asax Application_Error event not fired if custom errors are turned on?

Application_Error does not fire?

Global.asax not firing for .aspx pages in IIS7

1 个答案:

答案 0 :(得分:0)

事实证明这些答案是正确的:

Application_Error does not fire?

Is global.asax Application_Error event not fired if custom errors are turned on?

我最终将代码更改为:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)

    Dim ex As Exception = Server.GetLastError

    If TypeOf ex Is System.Web.HttpRequestValidationException Then
        Server.ClearError()
        'NavigateToErrorPage() calls Server.Transfer()

        NavigateToErrorPage("Display special error message here")
    End If

End Sub

在旧配置和新配置之间确实改变了框架,因为之前工作正常,因此我的困惑。它最有可能是IIS或MVC被引入webforms项目的事实。我现在只能理论化,但似乎在Server.Transfer()事件中调用Application_Error也会产生调用Server.ClearError()的次要影响。但是,在新环境中,情况已不再如此。我打赌Server.Transfer()确实尝试导航到自定义页面,但是,由于错误未在事件结束时被清除,因此ASP.NET的默认错误处理进入并将用户带到error.aspx

所以看起来好像这是一个愚蠢的问题,尽管对于经历剧烈环境变化的其他人来说,保持原因并且想知道为什么他们从未改变过的代码突然停止工作这一点非常重要。