Non ottenere il reindirizzamento alla pagina di errore personalizzata utilizzando errori personalizzati - ASP.Net
-
22-09-2019 - |
Domanda
Ecco il mio Application_OnError event sink in 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
Vedrai che se abbiamo un'eccezione più interna di tipo AccessDeniedException gettiamo un nuovo HTTPExcpetion con un codice di stato 403 AKA 'proibito'
Ecco la voce del web.config rilevanti:
<customErrors defaultRedirect="~/Application/ServerError.aspx" mode="On">
<error statusCode="403" redirect="~/Secure/AccessDenied.aspx" />
</customErrors>
Allora, cosa ci aspettiamo è un reindirizzamento alla pagina AccessDenied.aspx. Quello che get è un reindirizzamento alla pagina ServerError.aspx.
Abbiamo anche provato questo:
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
Il che unsuprisingly non funziona neanche.
Tutte le idee che stiamo facendo di sbagliato?
Soluzione
Application_Error
ha lo scopo di rilevare gli errori che non sono gestiti dall'applicazione. Quando si spara, un errore è già successo e tutto ciò che è su questo errore. Se si lancia un errore dall'interno Application_Error
in realtà si sta dicendo "non c'è un errore con il mio gestore di errori". Invece solo Server.Transfer
alla pagina appropriata. Se si desidera mantenere tutti i tuoi logica reindirizzamento in web.config è possibile vedere questo articolo su come analizzare la sezione customErrors per capire dove reindirizzare.
Detto questo, e non ho provato questo, ma si può provare Server.ClearError()
chiamare:
Dim Ex = Server.GetLastError()
Server.ClearError()
Throw New HttpException(System.Net.HttpStatusCode.Forbidden, Nothing, Ex)
Non credo che funzionerà a causa di quello che ho detto sopra, ma vale la pena di provare.