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