2010-01-26 9 views
8

Estoy buscando utilizar ELMAH por primera vez pero tengo un requisito que debe cumplirse que no estoy seguro de cómo lograr ...ELMAH - Uso de páginas de error personalizadas para recopilar comentarios de los usuarios

Básicamente, voy a configurar ELMAH para que funcione en asp.net MVC y logre registrar errores en la base de datos cuando se produzcan. Además de esto, utilizaré customErrors para dirigir al usuario a una página de mensajes amistosa cuando se produce un error. Bastante estándar ...

El requisito es que en esta página personalizada de error dispongo de un formulario que permite al usuario proporcionar información adicional si lo desea. Ahora el problema surge debido al hecho de que en este punto el error ya está registrado y necesito asociar el error loged con los comentarios de los usuarios.

Normalmente, si estaba utilizando mi propia implementación personalizada, después de registrar el error pasaría el ID del error a la página de error personalizado para que se pueda establecer una asociación. Pero debido a la forma en que funciona ELMAH, no creo que lo mismo sea posible.

Por lo tanto me preguntaba cómo la gente pensaba que uno puede ir haciendo esto ....

Saludos

ACTUALIZACIÓN:

Mi solución al problema es el siguiente:

public class UserCurrentConextUsingWebContext : IUserCurrentConext 
{ 
    private const string _StoredExceptionName = "System.StoredException."; 
    private const string _StoredExceptionIdName = "System.StoredExceptionId."; 

    public virtual string UniqueAddress 
    { 
     get { return HttpContext.Current.Request.UserHostAddress; } 
    } 

    public Exception StoredException 
    { 
     get { return HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] as Exception; } 
     set { HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] = value; } 
    } 

    public string StoredExceptionId 
    { 
     get { return HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] as string; } 
     set { HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] = value; } 
    } 
} 

Luego cuando ocurre el error, tengo algo como esto en mi Global.asax:

public void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    var item = new UserCurrentConextUsingWebContext(); 
    item.StoredException = args.Entry.Error.Exception; 
    item.StoredExceptionId = args.Entry.Id; 
} 

Entonces donde quiera que esté más tarde se puede tirar de los detalles por

var item = new UserCurrentConextUsingWebContext(); 
    var error = item.StoredException; 
    var errorId = item.StoredExceptionId; 
    item.StoredException = null; 
    item.StoredExceptionId = null; 

Nota esto no es 100% perfecto como sea posible para la misma IP para tener múltiples peticiones a tener errores en el mismo hora. Pero la posible explicación de eso es remota. Y esta solución es independiente de la sesión, que en nuestro caso es importante, también algunos errores pueden provocar que las sesiones finalicen, etc. De ahí que este enfoque nos haya funcionado bien.

+0

¿Recibió esto funcione? Estoy teniendo el mismo problema. Seguí el consejo de Atif, pero cuando hago referencia a HttpContext.Items para Elmah Id en mi página de error personalizada, obtengo una excepción de referencia nula. –

+0

@Ronnie Overby: consulte la edición anterior. –

+0

Gracias. Pensé en hacer algo así, pero usando una combinación cookie/ipaddress como identificador. En última instancia, acabo de hacer esto: http://stackoverflow.com/questions/2885487/problem-passing-elmah-log-id-to-custom-error-page-in-asp-net/2906440#2906440 –

Respuesta

8

El ErrorLogModule en ELMAH (versión 1.1 partir de este escrito) proporciona un evento Logged que puede manejar en Global.asax y que se puede utilizar para comunicar datos, por ejemplo a través de HttpContext.Items colección, a su página de error personalizada. Si se registró el ErrorLogModule bajo el nombre ErrorLog en web.config continuación, el controlador de eventos en Global.asax se verá así:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    var id = args.Entry.Id 
    // ... 
} 
+0

Saludos, gracias por esto. –

Cuestiones relacionadas