这是我在global.asax.vb中的Application_OnError事件接收器:
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
Dim innerMostException As Exception = getInnerMostException(Me.Context.Error)
If TypeOf innerMostException Is AccessDeniedException Then
Security.LogAccessDeniedOccurrence(DirectCast(innerMostException, AccessDeniedException))
Dim fourOhThree As Integer = DirectCast(HttpStatusCode.Forbidden, Integer)
Throw New HttpException(fourOhThree, innerMostException.Message, innerMostException)
End If
End Sub
你会看到,如果我们有一个类型为AccessDeniedException的最内层异常,我们会抛出一个新的HTTPExcpetion,状态代码为403 AKA'idbidden'
这是相关的web.config条目:
<customErrors defaultRedirect="~/Application/ServerError.aspx" mode="On">
<error statusCode="403" redirect="~/Secure/AccessDenied.aspx" />
</customErrors>
所以我们期待的是重定向到AccessDenied.aspx页面。我们获取的内容是重定向到ServerError.aspx页面。
我们也试过这个:
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
Dim innerMostException As Exception = getInnerMostException(Me.Context.Error)
If TypeOf innerMostException Is AccessDeniedException Then
Security.LogAccessDeniedOccurrence(DirectCast(innerMostException, AccessDeniedException))
Context.Response.StatusCode = DirectCast(HttpStatusCode.Forbidden, Integer)
End If
End Sub
其中一些不完整也无效。
任何想法我们做错了什么?
答案 0 :(得分:0)
Application_Error
旨在捕获应用程序未处理的错误。当它触发时,错误已经发生,一切都是关于该错误的。如果你从Application_Error
中抛出一个错误,你实际上在说“我的错误处理程序出错了”。而只是Server.Transfer
到适当的页面。如果要在web.config中保留所有重定向逻辑,可以看到this article有关如何解析customErrors部分以找出重定向到的位置。
所有这些都说,我没试过,但你可以尝试拨打Server.ClearError()
:
Dim Ex = Server.GetLastError()
Server.ClearError()
Throw New HttpException(System.Net.HttpStatusCode.Forbidden, Nothing, Ex)
我认为它不会起作用,因为我上面所说的但值得一试。