Non ottenere il reindirizzamento alla pagina di errore personalizzata utilizzando errori personalizzati - ASP.Net

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top