Pregunta

Me dieron la emocionante tarea de reescribir nuestro sistema de manejo de excepciones. Si bien afirmaré que manejar excepciones desde el punto de vista de toda la aplicación no es algo que queramos, por lo general es inevitable cuando nuestro equipo no tiene suficiente personal para la gran cantidad de trabajo que tenemos que hacer, así que, por favor, no critique solución globalizada para el manejo de excepciones aquí :)

He tenido una buena búsqueda para ver qué soluciones comunes existen. En este momento, utilizamos Global.asax con el evento Application_Error para hacer Server.GetLastError () que se coloca en el estado Sesión, luego se llama a una redirección a otra página donde los datos de la sesión se recuperan y se envían en un formato legible para humanos. La redirección también llama a un sproc que auditará cuidadosamente la información del error que se envía por correo electrónico a los desarrolladores yb) se ve desde una página web que solo los desarrolladores pueden ver.

La nueva forma que he visto de hacer las cosas es usar la interfaz IHttpModule usando una clase en App_Code para hacer algo en este sentido (esta es mi implementación rápida)

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

Mi pregunta es, ¿cuál es el beneficio de esta solución sobre el uso de eventos Global.asax? Además, ¿cuál es la mejor manera de entregar los datos a una página de error?

EDITAR: El código anterior funciona por cierto;)

EDITAR: Además, ¿cómo funciona el HttpModule detrás de escena? ¿Simplemente registra el evento Error en esa función en particular al iniciar la aplicación?

UPDATE:

Tras una investigación más profunda, parece que obtener datos de la sesión es realmente, muy complicado cuando se trata de usar la interfaz IHttpModule. No creo que MS haya madurado HttpModule lo suficiente como para que se use en nuestro escenario particular, hasta que haya eventos específicos para los datos de la sesión, es demasiado peligroso para nosotros usarlos.

¿Fue útil?

Solución

El uso de un módulo tiene la ventaja de ser fácilmente extraíble, todo lo que necesita hacer para desactivarlo es eliminarlo de < httpModules > en su configuración.

En cuanto a sus datos, intente con Server.Transfer o Server.RewritePath : conservará todos los datos actuales (incluido el último error del servidor).

Si por alguna razón borra el último error, puede guardar el error en HttpContext.Items antes de la transferencia / reescritura y luego recuperarlo después.

Editar: En respuesta a su edición, un IHttpModule se adjunta a cualquier evento apropiado en su implementación IHttpModule.Init .

Otros consejos

HttpModule básicamente hace lo mismo que Global.asax. Está diseñado como un módulo más reutilizable y autónomo para el manejo de eventos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top