Не получается перенаправление на страницу пользовательских ошибок с помощью пользовательских ошибок - ASP.Net - PullRequest
0 голосов
/ 24 марта 2010

Вот мой приемник событий 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

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

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

1 Ответ

0 голосов
/ 24 марта 2010

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)

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

...