如何添加SQL ELMAH_Error.ErrorID到ELMAH错误邮件主题
本文关键字:ELMAH ErrorID 错误 Error 何添加 添加 SQL | 更新日期: 2023-09-27 18:18:29
我使用ELMAH将错误记录到SQL数据库并发送电子邮件。我想附加ELMAH_Error。ErrorId到ELMAH邮件的主题。
我将ELMAH在ElmahLog_Logged事件中提供的ErrorId保存到一个会话变量中,正如我在这个问题中发现的那样。Atif Aziz本人在这篇博客文章中评论了以下信息:
如果有人想在邮寄过程中破解记录的错误,他会的必须在ErrorLogModule中拾取它。记录事件。这可能是例如,将记录错误的Id推送到邮件中非常方便。要做到这一点,您需要将已登录事件的Id隐藏到HttpContext并稍后在邮件事件中使用它。要想让它起作用,模块应该已经注册,以便邮件事件发生在已记录的事件之后。
我认为,由于httpModules首先添加ErrorLog,其次添加ErrorMail,这将实现在登录事件之后注册邮寄事件。我想这是在讨论事件的顺序,而不是模块应用的顺序。
如何注册HttpModules的事件顺序?
我尝试了下面的代码,但没有效果。下面的代码阻止电子邮件发送,但是错误仍然被记录到SQL表中。
网络。配置:
<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>
…和…
<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>
当然和正确配置(我通过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);
}
如果我将global.asax.cs中的errormail_邮寄事件代码更改为以下代码,我将收到具有errormail_邮寄事件代码中指定的主题的电子邮件。我甚至试着把塞申斯。主题中的SessionID,这会破坏电子邮件功能。这让我认为errormail_邮寄事件没有会话访问权限。这是正确的吗?
protected void ErrorMail_Mailing(object sender, ErrorMailEventArgs e)
{
e.Mail.Subject = "I changed the subject in global.asax";
}
答案非常简单。ErrorMailEventsArgs。Error对象包含发生异常时的会话信息。errormail_mail甚至没有访问会话上下文的权限。因此,解决方案就像从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);
}
另外,如果你的ErrorMail处理程序在ErrorLog之后注册(通过在web中添加ErrorLog来完成),只需将ElmahId放在ErrorLog_Logged事件的Session中。,该会话变量将在会话变量部分的标准ELMAH错误电子邮件。
protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
Session["ElmahId"] = args.Entry.Id;
}
更新: Atif Aziz提出的错误。SessionVariables不在原始ELMAH源代码中,而是在补丁中。这里是我的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>