Не происходит перенаправление на пользовательскую страницу ошибок с использованием пользовательских ошибок - ASP.Net
-
22-09-2019 - |
Вопрос
Вот мой приемник событий 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)
Я не думаю, что это сработает из-за того, что я сказал выше, но попробовать стоит.