9
votes

Comment obtenir Elmah d'inclure des valeurs de session?

Remarque: Je connais les différentes raisons pour éviter d'utiliser la session, mais c'est un projet que j'ai hérité, s'il vous plaît ignorer cette partie de toutes les réponses :)

Puisque c'est un problème résolu, j'espère que quelqu'un peut pointer vers un patch / une branche / fourchette d'Elmah qui inclut des données de la session de journalisation plutôt que de réinventer la roue.

Une chose étrange est un ancien poste d'ATIF qui dit qu'ils sont déjà enregistrés:

http://markmail.org/Message/ncmdgwm5rmzewbwu

commentateur Henningst mentionné Ajouter dans les variables de session ici:

http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx < / p>

Une autre approche (je préférerais éviter) la copie des valeurs dans des cookies

http://www.sharpdeveloper.net/content/archive/2008/11/10/how-o-get-session-OR-Outher-Custom-values-into-elmah.aspx

Je sais qu'une alternative consiste à passer à quelque chose à côté d'Elmah (comme Exceptionnel - voir http: // exceptionnant. com / public / exceptionnelandelmah.aspx ) Mais comme il s'agit de mon seul problème avec Elmah pour le moment, je préférerais juste avoir une elmah patchée que de passer à autre chose.


0 commentaires

3 Réponses :


6
votes

1 commentaires

Vous n'avez pas vraiment besoin de patcher apparemment, alors je suis révélateur. Vérifiez la réponse des penseurs



3
votes

Plutôt que de corriger Elmah, je l'ai fait avec des données d'exception. Dans Global.Asax, j'ai inséré les données supplémentaires à l'exception sur Application_Error (). "HistoireStack" est ma propre classe pour enregistrer l'historique des utilisateurs, y compris le bouton et l'onglet clics: xxx pré>

puis, dans errorormail_mailing (), j'ai saisi les données et l'a annexé dans l'e-mail: P >

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
{
    var stack = e.Error.Exception.Data["historyStack"] as Stack<string>;
    if (stack == null && e.Error.Exception.InnerException != null)
    {
        // could probably skip the first try and go straight to this assignment:
        stack = e.Error.Exception.InnerException.Data["historyStack"] as Stack<string>;
    }

    if (stack != null && stack.Count > 0)
    {
        e.Mail.Body = e.Mail.Body + "<h1>Browsing History</h1>" + System.Environment.NewLine;
        while (stack.Count > 0)
        {
            e.Mail.Body = e.Mail.Body + stack.Pop() + "<br />" + System.Environment.NewLine;
        }
    }
}


6 commentaires

C'est essentiellement ce que j'ai fait aussi, sauf que je crée une pièce jointe à l'e-mail pour garder des variables de session un peu séparées. L'inconvénient est que vous appuyez sur le module mailing Elmahs, donc s'il y a quelqu'un qui ne l'utilise pas, ils sont toast + Vous ne pouvez pas interroger sur votre base de données pour obtenir des statistiques sur ces variables.


Quel est le format de l'historiqueStack.dump () valeur retournée? Est-ce juste en clair de crlf?


Cela ne semble pas fonctionner pour moi. Bien que Application_error () incendie, les données supplémentaires ne semblent jamais se retrouver dans le XML dans la base de données, il n'ya donc aucun moyen de le voir :( Y a-t-il une étape supplémentaire requise quelque part?


@Nickg HistoryStack.dump () Retourne une pile Bien que vous puissiez mettre tout ce qui est là depuis Exception.Data est un dictionnaire d'objets. En outre, seul le module de diffusion de mon exemple fait quelque chose avec ces données, pour la stocker dans la base de données peut être délicate: Stackoverflow.com/questions/10086638/...


@Thinkofanumber Où mettez-vous errorormail_mailing ? Dans Global? Est-ce que Elmah vient juste le chercher et l'exécuter?


J'ai compris que vous venez de le mettre dans le fichier global et qu'il l'exécute. Comment stockez-vous HistoryStack ? Il semble que je ne puisse pas utiliser la session pour cette session de Becuase n'existe pas au Application_Error .



0
votes

L'ancien patch pouvant être creusé est malheureusement un peu obsolète avec Elmah maintenant. Voici ce que j'ai fait pour enregistrer les variables de session dans la version 2.0.15523.27 Basé sur un ancien patch trouvé ici: https://storage.googleapis.com/google-code-attachments/elmah/issue-12/comment-5/elmah-sessionvariables.patch

en erreur.cs fort > p>

import system.web.sessionState p> xxx pré>

trouver: p> xxx pré>

Ajouter ci-dessous: xxx pré>

trouver: p> xxx pré>

Ajouter ci-dessous: p>

<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah.AspNet, Version=2.0.15523.27, Culture=neutral, PublicKeyToken=null" />


0 commentaires