2010-01-26 2 views
8

Je suis à la recherche à l'aide ELMAH pour la première fois, mais une exigence qui doit être satisfait que je ne suis pas sûr de savoir comment s'y prendre pour atteindre ...ELMAH - Utilisation des pages d'erreur personnalisée pour recueillir les commentaires des utilisateurs

Fondamentalement, je vais configurer ELMAH pour travailler sous asp.net MVC et l'obtenir pour enregistrer les erreurs dans la base de données quand ils se produisent. En plus de cela, j'utilise customErrors pour diriger l'utilisateur vers une page de message amicale lorsqu'une erreur survient. Des choses assez standard ...

L'exigence est que sur cette page d'erreur personnalisée j'ai un formulaire qui permet à l'utilisateur de fournir des informations supplémentaires si elles le souhaitent. Maintenant, le problème se pose en raison du fait que, à ce stade, l'erreur est déjà enregistrée et j'ai besoin d'associer l'erreur consignée avec les commentaires des utilisateurs.

Normalement, si j'utilisais ma propre implémentation personnalisée, après avoir enregistré l'erreur, je passerais l'ID de l'erreur à la page d'erreur personnalisée afin qu'une association puisse être faite. Mais à cause de la façon dont ELMAH fonctionne, je ne pense pas que la même chose soit tout à fait possible.

Par conséquent, je me demandais comment les gens pensaient que l'on pourrait s'y prendre ....

Vive

MISE À JOUR:

Ma solution au problème est la suivante:

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

Puis, quand l'erreur se produit, j'ai quelque chose comme ça dans mon 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; 
} 

Alors, où que vous soyez plus tard, vous pouvez retirer les détails par

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

Notez que cela ne 100% parfait comme il est possible pour le même IP d'avoir plusieurs demandes d'avoir des erreurs au même temps. Mais le capuchon probable de cet événement est lointain. Et cette solution est indépendante de la session, ce qui dans notre cas est important, aussi certaines erreurs peuvent entraîner l'arrêt des sessions, etc. C'est pourquoi cette approche a bien fonctionné pour nous.

+0

Avez-vous obtenu cela fonctionne? J'ai le même problème. J'ai suivi les conseils d'Atif, mais quand je fais référence à HttpContext.Items pour l'identifiant d'Elmah sur ma page d'erreur personnalisée, j'obtiens une exception de référence nulle. –

+0

@Ronnie Overby: Voir ci-dessus modifier. –

+0

Merci. J'ai pensé à faire quelque chose comme ça, mais en utilisant une combinaison cookie/ipaddress comme identifiant. En fin de compte, je viens de le faire: http://stackoverflow.com/questions/2885487/problem-passing-elmah-log-id-to-custom-error-page-in-asp-net/2906440#2906440 –

Répondre

8

Le ErrorLogModule dans ELMAH (version 1.1 de cette écriture) fournit un événement Logged que vous pouvez gérer dans Global.asax et que vous pouvez utiliser pour communiquer les détails, par exemple via la collecte HttpContext.Items, à votre page d'erreur personnalisée. Si vous avez enregistré le ErrorLogModule sous le nom ErrorLog dans web.config alors votre gestionnaire d'événement dans Global.asax ressemblera à ceci:

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

Bravo, merci pour cela. –

Questions connexes