Domanda

Mi è stato dato l'emozionante compito di riscrivere il nostro sistema di gestione delle eccezioni. Mentre affermerò che la gestione delle eccezioni dal punto di vista dell'intera applicazione non è qualcosa che vogliamo, in genere è inevitabile quando il nostro team è a corto di personale per la mole di lavoro che dobbiamo spingere fuori dalla porta, quindi per favore, nessun soluzione globalizzata per la gestione delle eccezioni qui :)

Ho avuto una buona caccia per vedere quali soluzioni comuni esistono. Al momento utilizziamo Global.asax con l'evento Application_Error per eseguire Server.GetLastError () che si trova nello stato Session, quindi un reindirizzamento viene chiamato su un'altra pagina in cui i dati della sessione vengono quindi recuperati e trasmessi in un formato leggibile dall'uomo. Il reindirizzamento chiama anche uno sproc che controllerà attentamente le informazioni di errore che sono a) inviate per posta elettronica agli sviluppatori eb) visualizzate da una pagina Web visualizzabile solo dagli sviluppatori.

Il nuovo modo in cui ho visto di fare le cose è usare l'interfaccia IHttpModule usando una classe in App_Code per fare qualcosa del genere (questa è la mia rapida implementazione)

Imports Microsoft.VisualBasic

Public Class ErrorModule : Implements IHttpModule

  Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
    ' Not used
  End Sub

  Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
    AddHandler context.Error, AddressOf context_Error
  End Sub

  Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
    Dim ex As Exception = HttpContext.Current.Server.GetLastError

    ' do something with the error
    ' call the stored procedure
    ' redirect the user to the error page

    HttpContext.Current.Server.ClearError()
    HttpContext.Current.Response.Redirect("index.htm")

  End Sub
End Class

La mia domanda è: qual è il vantaggio di questa soluzione rispetto all'utilizzo degli eventi Global.asax? Inoltre, qual è il modo migliore per consegnare i dati a una pagina di errore?

EDIT: Il codice sopra funziona comunque;)

MODIFICA: Inoltre, come funziona HttpModule dietro le quinte? Registra semplicemente l'evento Error su quella particolare funzione all'avvio dell'applicazione?

UPDATE:

Dopo ulteriori approfondimenti sembra che afferrare i dati della sessione sia davvero, molto disordinato quando si tratta di utilizzare l'interfaccia IHttpModule. Non credo che gli MS abbiano maturato HttpModule abbastanza da poter essere utilizzato nel nostro particolare scenario - fino a quando non ci sono eventi specifici per i dati di sessione è troppo pericoloso per noi da usare.

È stato utile?

Soluzione

L'uso di un modulo ha il vantaggio di essere facilmente rimovibile, tutto ciò che devi fare per disabilitarlo è rimuoverlo da < httpModules > nella tua configurazione.

Per quanto riguarda i tuoi dati, prova ad andare con Server.Transfer o Server.RewritePath - che manterrà tutti i dati correnti (incluso l'ultimo errore del server).

Se per qualche motivo cancella l'ultimo errore, puoi salvare l'errore in HttpContext.Items prima del trasferimento / riscrittura e poi recuperarlo in seguito.

Modifica: in risposta alla modifica, un IHttpModule si collega a tutti gli eventi appropriati nel suo implementazione di IHttpModule.Init .

Altri suggerimenti

HttpModule sostanzialmente fa la stessa cosa di Global.asax. È progettato come un modulo più riutilizzabile e autonomo per la gestione degli eventi.

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