从IIS 6迁移到IIS 8.5后,自定义错误处理不再起作用

时间:2015-08-11 15:35:11

标签: asp.net vb.net iis

我们最近使用VB.Net编写的ASP.Net从运行Windows Server 2003(IIS 6)的旧Web服务器迁移到运行Windows Server 2012(IIS 8.5)的全新生产服务器,将我们的一个内部Web应用程序迁移。

然而,迁移基本上是成功的,因为迁移我们的应用程序已停止使用我们的错误页面处理错误,而是在浏览器中显示完整的ASP错误以供用户查看。

我比较了网站和应用程序池配置(运行为.Net v2.0),它们看起来完全相同(web.config文件完全相同)。

两个web.config文件都将自定义错误设置为关闭,这解释了为什么会向用户显示完整的错误消息,但是,这应该由我们的Web应用程序处理。

我们没有使用自定义错误页面,因为我们在global.asax文件中有一个函数,它捕获错误然后将其传递给相关的错误页面。

这是global.asax中使用的代码:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' Fires when an error occurs
Try
    Dim blnSendCustomErrorPage As Boolean = SendCustomErrorPages()

    Dim strAuditMessage As String

    Dim ex As Exception = Server.GetLastError.GetBaseException
    Dim lngCallID As Long = -1
    Dim lngAuditLogID As Long = -1

    If Not CurrentUser.WorkingSession Is Nothing Then
        lngCallID = CurrentUser.WorkingSession.CallID
    End If

    If Not ex Is Nothing Then
        If ex.GetType() Is GetType(System.IO.FileNotFoundException) Then
            strAuditMessage = ex.Message
            lngAuditLogID = WebAuditLog.Write( _
                WebAuditLog.AuditLookup.PageNotFoundException, strAuditMessage, _
                MethodBase.GetCurrentMethod().MethodHandle, lngCallID)

            If Response.IsClientConnected AndAlso blnSendCustomErrorPage Then
                Response.Redirect("~/error/PageNotFound.aspx?AuditLogID=" & lngAuditLogID, True)
            End If

        ElseIf ex.GetType Is GetType(System.UnauthorizedAccessException) Then
            strAuditMessage = ex.Message
            lngAuditLogID = WebAuditLog.Write( _
                                    WebAuditLog.AuditLookup.AccessNotAllowedException, strAuditMessage, _
                                    MethodBase.GetCurrentMethod().MethodHandle, lngCallID)

            If Response.IsClientConnected AndAlso blnSendCustomErrorPage Then
                Response.Redirect("~/error/NoAccess.aspx?AuditLogID=" & lngAuditLogID, True)
            End If
       Else
            Dim blnWriteToLog As Boolean = True
            If ex.GetType Is GetType(SqlClient.SqlException) Then
                Dim exSql As SqlClient.SqlException = DirectCast(ex, SqlClient.SqlException)
                If exSql.Number = 17 Then '(SQL Server does not exist or access denied.)
                    blnWriteToLog = False
                End If
            End If
            strAuditMessage = WebAuditLog.GetExceptionSummary(ex)
            If blnWriteToLog Then
                lngAuditLogID = WebAuditLog.Write( _
                                          WebAuditLog.AuditLookup.ApplicationErrorException, strAuditMessage, _
                                          MethodBase.GetCurrentMethod().MethodHandle, lngCallID)
            Else
                lngAuditLogID = -1
            End If

            If Response.IsClientConnected AndAlso blnSendCustomErrorPage Then
                Response.Redirect("~/error/ApplicationError.aspx?AuditLogID=" & lngAuditLogID) '& _
                '"&Message=" & HttpUtility.UrlEncode(ex.Message), True)
            End If
        End If
    Else
        strAuditMessage = "Server.GetLastError.GetBaseException Is Nothing"
        lngAuditLogID = WebAuditLog.Write( _
                        WebAuditLog.AuditLookup.ApplicationErrorException, strAuditMessage, _
                        MethodBase.GetCurrentMethod().MethodHandle, lngCallID)

        If Response.IsClientConnected AndAlso blnSendCustomErrorPage Then
            Response.Redirect("~/error/ApplicationError.aspx?AuditLogID=" & lngAuditLogID, True)
        End If
    End If

    Notification.Notify(Notification.NotificationType.Email, _
            "Application Error AuditLogID " & lngAuditLogID.ToString & " " & _
            User.Identity.Name & System.Environment.NewLine & strAuditMessage, "", , "BOCSS Error " & User.Identity.Name)

Catch exApplication_Error As Exception
    'TODO: Decide what to do. -> Write to text file
End Try
End Sub

由于某些原因我无法确定IIS 8.5在发生错误时没有调用此函数,而是在浏览器上显示详细错误。 IIS 6没有这样做。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

将此代码放在system.web标记下的web配置文件中。而不是使用global.asax文件。在自定义错误本身中,您可以重定向到错误页面以查找相应的错误代码。

 <customErrors mode="On" defaultRedirect="inconvience.html">
 <error statusCode="404" redirect="pagenotfound.html"/>
 <error statusCode="500" redirect="page1.html"/>
 </customErrors>