Não obtendo redirecionamento para a página de erro personalizada usando erros personalizados - ASP.NET
-
22-09-2019 - |
Pergunta
Aqui está o meu evento Application_ONerror Sink em 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
Você verá que, se tivermos uma exceção mais interna do tipo AccessdeniedException, jogamos um novo httpexcpetion com um código de status de 403 aka 'proibido'
Aqui está a entrada relevante da Web.config:
<customErrors defaultRedirect="~/Application/ServerError.aspx" mode="On">
<error statusCode="403" redirect="~/Secure/AccessDenied.aspx" />
</customErrors>
Então, o que esperamos é um redirecionamento para a página Accessdenied.aspx. O que nós pegue é um redirecionamento para a página ServerError.aspx.
Nós também tentamos o seguinte:
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
O que, sem sucesso, também não funciona.
Alguma idéia do que estamos fazendo de errado?
Solução
Application_Error
destina -se a capturar erros que não são tratados pelo seu aplicativo. Quando dispara, um erro já aconteceu e tudo é sobre esse erro. Se você apresentar um erro de dentro Application_Error
Você está realmente dizendo "há um erro com meu manipulador de erros". Em vez disso Server.Transfer
para a página apropriada. Se você quiser manter toda a sua lógica de redirecionamento em web.config, você pode ver Este artigo sobre como analisar a seção CustomErrors para descobrir para onde redirecionar.
Tudo isso dito, e eu não tentei isso, mas você pode tentar ligar Server.ClearError()
:
Dim Ex = Server.GetLastError()
Server.ClearError()
Throw New HttpException(System.Net.HttpStatusCode.Forbidden, Nothing, Ex)
Eu não acho que funcionará por causa do que eu disse acima, mas vale a pena tentar.