我们最近使用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没有这样做。
出了什么问题?
答案 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>