4 votes

Comment ajouter le SQL ELMAH_Error.ErrorID à l'objet du courriel d'erreur ELMAH ?

J'utilise ELMAH pour enregistrer les erreurs dans une base de données SQL ET envoyer un courriel. J'aimerais ajouter ELMAH_Error.ErrorId à l'objet de l'e-mail ELMAH.

J'enregistre l'ErrorId qu'ELMAH fournit dans l'événement ElmahLog_Logged dans une variable de session comme je l'ai découvert dans cette question . Atif Aziz lui-même a commenté cet article de blog les informations suivantes à ce sujet :

Si l'on veut avoir accès à l'erreur enregistrée pendant l'envoi, il faudrait de la récupérer dans l'événement ErrorLogModule.Logged. Cela pourrait être pratique, par exemple, pour pousser l'Id de l'erreur enregistrée dans le courrier. Pour cela, il faut cacher l'Id de l'évènement Logged dans le HttpContext et l'utiliser plus tard dans l'événement Mailing. Pour que cela fonctionne, les modules devraient être enregistrés de telle sorte que l'événement Mailing se produise après l'événement Logged.

Je pensais que puisque les httpModules sont ajoutés avec ErrorLog en premier et ErrorMail en second, cela permettrait d'enregistrer l'événement Mailing après l'événement Logged. Je suppose qu'il s'agit de l'ordre des événements, et non de l'ordre dans lequel les modules sont appliqués.

Comment enregistrer l'ordre des événements des HttpModules ?

J'ai essayé le code ci-dessous, sans succès. Le code ci-dessous empêche l'envoi du courriel, mais l'erreur est toujours enregistrée dans la table SQL.

Web.Config :

<system.web>
    <httpModules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>
    <httpHandlers>
        <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
</system.web>

... et ...

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    <handlers>
        <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </handlers>
</system.webServer>

Et bien sûr les et sont correctement configurés (j'ai installé via NuGet).

Global.asax.cs :

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    Session["ElmahId"] = args.Entry.Id;
}

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    var elmahErrorId = Session["ElmahId"].ToString();
    e.Mail.Subject = String.Format("{0}, see ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);            
}

Si je change le code de l'événement ErrorMail_Mailing dans global.asax.cs par le code suivant, je reçois l'e-mail avec le sujet spécifié dans le code de l'événement ErrorMail_Mailing comme je le devrais. J'ai même essayé de mettre simplement Session.SessionID dans le sujet et cela tue la fonctionnalité d'email. Cela me fait penser que l'événement ErrorMail_Mailing n'a pas accès à la session. Est-ce exact ?

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    e.Mail.Subject = "I changed the subject in global.asax";
}

5voto

JustinP8 Points 619

La réponse était incroyablement facile. L'objet ErrorMailEventsArgs.Error contient les informations de la session au moment de l'exception. L'objet ErrorMail_Mailing n'a même pas accès au contexte de la session. La solution est donc aussi simple que de tirer votre variable de l'objet ErrorMailEventArgs.

protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
    var elmahErrorId = e.Error.SessionVariables["ElmahId"].ToString();
    if (!string.IsNullOrEmpty(elmahErrorId))
        e.Mail.Subject = String.Format("{0}, see ELMAH_Error.ErrorID = {1}", e.Mail.Subject, elmahErrorId);
}

De plus, simplement en mettant l'ElmahId dans Session dans l'événement ErrorLog_Logged, si votre gestionnaire ErrorMail est enregistré après ErrorLog (fait en ajoutant d'abord ErrorLog dans web.config), cette variable de session sera dans la section Variables de Session l'email d'erreur standard ELMAH.

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    Session["ElmahId"] = args.Entry.Id;
}

Mise à jour : Atif Aziz a signalé que la variable Errors.SessionVariables ne se trouve pas dans la source originale d'ELMAH, mais dans un patch. Voici mon packages.config :

<packages>
    <package id="elmah.corelibrary" version="1.2" />
    <package id="elmah" version="1.2.0.1" />
    <package id="elmah.sqlserver" version="1.2" />
</packages>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X