2010-05-21 5 views
6

Estoy usando ELMAH para registrar excepciones no controladas en una aplicación ASP.NET Webforms. El registro funciona bien.Problema al pasar el ID de registro de ELMAH a la página de error personalizado en ASP.NET

Quiero pasar el ID de registro de errores de ELMAH a una página de error personalizada que le dará al usuario la posibilidad de enviar un correo electrónico a un administrador sobre el error. He seguido los consejos del this answer. Aquí está mi global.asax código:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{   
    Session[StateKeys.ElmahLogId] = args.Entry.Id; 

    // this doesn't work either: 
    // HttpContext.Current.Items[StateKeys.ElmahLogId] = args.Entry.Id; 
} 

Pero, en la página de error personalizada, la sesión de referencia variable y HttpContext.Current.Items me están dando una excepción NullReference. ¿Cómo puedo pasar el ID a mi página de error personalizada?

Respuesta

7

Esto funciona para mí:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    if (args.Entry.Error.Exception is HandledElmahException) 
     return; 

    var config = WebConfigurationManager.OpenWebConfiguration("~"); 
    var customErrorsSection = (CustomErrorsSection)config.GetSection("system.web/customErrors");   

    if (customErrorsSection != null) 
    { 
     switch (customErrorsSection.Mode) 
     { 
      case CustomErrorsMode.Off: 
       break; 
      case CustomErrorsMode.On: 
       FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect); 
       break; 
      case CustomErrorsMode.RemoteOnly: 
       if (!HttpContext.Current.Request.IsLocal) 
        FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect); 
       break; 
      default: 
       break; 
     } 
    }   
} 

void FriendlyErrorTransfer(string emlahId, string url) 
{ 
    Server.Transfer(String.Format("{0}?id={1}", url, Server.UrlEncode(emlahId))); 
} 
+2

Donde 'HandledElmahException' es una clase personalizada como se describe en su respuesta [aquí] (http://stackoverflow.com/a/2906221/39396) –

+4

¿Alguna vez recibió un" Error al ejecutar la solicitud secundaria ... "con 'Server.Transfer'? –

2

No puedo comentar sobre la solución de Ronnie. Tenía que en su lugar por un tiempo, pero se rompe el proceso de flujo de error estándar y causa ErrorLog_Logged para transferir siempre, incluso cuando se llama a

Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

Este es un problema si todavía quiere registrar un error dentro de una catch statement, por ejemplo, tiene una solución para un error pero desea registrar el error para realizar una reparación adecuada, que puede ser muy útil en problemas difíciles de replicar.

que fue capaz de corregir esto usando el siguiente cambio:

//if (customErrorsSection != null)  
if (customErrorsSection != null && this.Context.Error != null) 

Esto respeta el manejo apropiado de error típico, como el context.Error será nula en los casos en que usted plantea explícitamente la excepción en Elmah, pero no es nulo cuando se cae a través del manejo de error predeterminado (no a través de un catch o si es capturado y relanzado). Esto hace que la solución de Ronnie responda de manera similar a la lógica de manejo de errores de .Net.

+0

Dejé de usar Elmah hace bastante tiempo. Es más fácil registrar tus errores tú mismo. –

+0

Sí, tampoco sé si volvería a bajar por la carretera de Elmah. Es útil porque hace una buena presentación o la traza de la pila sin mucho trabajo, pero por lo general me deja con ganas de ampliarla, cambiar la estructura de datos y otras cosas que normalmente no valen la pena el esfuerzo que conlleva. – user2701750

+0

Obtener un seguimiento de pila realmente no es mucho más fácil que llamar a exception.ToString() ... Incluye el tipo de excepción, el mensaje y la pila de llamadas y las recursiones a través de los inners. –

Cuestiones relacionadas