没有使用自定义错误重定向到自定义错误页面 - ASP.Net

时间:2010-03-24 17:29:02

标签: asp.net vb.net web-config httpexception

这是我在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

其中一些不完整也无效。

任何想法我们做错了什么?

1 个答案:

答案 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)

我认为它不会起作用,因为我上面所说的但值得一试。