2010-01-26 3 views
8

Sto cercando di utilizzare ELMAH per la prima volta, ma hanno un requisito che deve essere soddisfatto che io non sono sicuro di come fare per raggiungere ...ELMAH - Uso delle pagine di errore personalizzate per raccogliere il feedback degli utenti

Fondamentalmente, ho intenzione di configurare ELMAH per funzionare in asp.net MVC e farlo registrare errori nel database quando si verificano. In cima a questo sto usando CustomErrors per indirizzare l'utente a una pagina di messaggio amichevole quando si verifica un errore. Cose abbastanza standard ...

Il requisito è che in questa pagina di errore personalizzata disponga di un modulo che consente all'utente di fornire informazioni aggiuntive se lo desiderano. Ora il problema sorge a causa del fatto che a questo punto l'errore è già registrato e ho bisogno di associare l'errore logato al feedback degli utenti.

In genere, se si stesse utilizzando la mia implementazione personalizzata, dopo aver registrato l'errore, avrei passato l'ID dell'errore alla pagina di errore personalizzata in modo che fosse possibile creare un'associazione. Ma a causa del modo in cui ELMAH funziona, non credo che lo stesso sia del tutto possibile.

Quindi mi chiedevo come la gente pensava che si potrebbe andare a fare questo ....

Acclamazioni

UPDATE:

mia soluzione al problema è il seguente:

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; } 
    } 
} 

Quindi quando si verifica l'errore, ho qualcosa di simile nel mio 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; 
} 

Allora dove mai si sono in seguito si può tirare fuori i dettagli da

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

notare che questo è perfetto non al 100% come il suo possibile per lo stesso IP di avere più richieste di avere errori allo stesso tempo. Ma il probabile cappuccio di quell'evento è remoto. E questa soluzione è indipendente dalla sessione, che nel nostro caso è importante, anche alcuni errori possono causare la fine delle sessioni, ecc. Quindi perché questo approccio ha funzionato bene per noi.

+0

hai preso questo per funzionare? Sto avendo lo stesso problema. Ho seguito il consiglio di Atif, ma quando faccio riferimento a HttpContext.Items per l'ID Elmah nella mia pagina di errore personalizzata, ottengo un'eccezione di riferimento null. –

+0

@Ronnie Overby: vedere sopra modifica. –

+0

Grazie. Ho pensato di fare qualcosa del genere, ma usando una combinazione di cookie/indirizzo IP come identificatore. In definitiva ho appena fatto questo: http://stackoverflow.com/questions/2885487/problem-passing-elmah-log-id-to-custom-error-page-in-asp-net/2906440#2906440 –

risposta

8

Il ErrorLogModule a ELMAH (versione 1.1 al momento della stesura) fornisce un evento Logged che è possibile gestire in Global.asax e che può essere utilizzato per comunicare i dettagli, ad esempio tramite HttpContext.Items raccolta, alla tua pagina di errore personalizzata. Se hai registrato il ErrorLogModule sotto il nome ErrorLog in web.config allora il vostro gestore di eventi in Global.asax sarà simile a questa:

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

Grazie, grazie. –