Не происходит перенаправление на пользовательскую страницу ошибок с использованием пользовательских ошибок - ASP.Net

StackOverflow https://stackoverflow.com/questions/2509953

Вопрос

Вот мой приемник событий Application_OnError в global.asax.vb:

    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 «запрещено».

Вот соответствующая запись 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

Что, что неудивительно, тоже не работает.

Есть идеи, что мы делаем неправильно?

Это было полезно?

Решение

Application_Error предназначен для обнаружения ошибок, которые не обрабатываются вашим приложением.Когда он срабатывает, ошибка уже произошла и все об этой ошибке.Если вы выдаете ошибку изнутри Application_Error на самом деле вы говорите: «В моем обработчике ошибок произошла ошибка».Вместо этого просто Server.Transfer на соответствующую страницу.Если вы хотите сохранить всю логику перенаправления в web.config, вы можете увидеть Эта статья о том, как проанализировать раздел customErrors, чтобы выяснить, куда перенаправить.

Все это сказано, и я этого не пробовал, но можете ли вы попробовать позвонить? Server.ClearError():

            Dim Ex = Server.GetLastError()
            Server.ClearError()
            Throw New HttpException(System.Net.HttpStatusCode.Forbidden, Nothing, Ex)

Я не думаю, что это сработает из-за того, что я сказал выше, но попробовать стоит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top