如何添加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";
}

如何添加SQL ELMAH_Error.ErrorID到ELMAH错误邮件主题

答案非常简单。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>