【问题标题】:How do I append the SQL ELMAH_Error.ErrorID to the ELMAH Error Email Subject?如何将 SQL ELMAH_Error.ErrorID 附加到 ELMAH 错误电子邮件主题?
【发布时间】:2011-12-22 02:59:18
【问题描述】:

我正在使用 ELMAH 将错误记录到 SQL 数据库并发送电子邮件。我想将 ELMAH_Error.ErrorId 附加到 ELMAH 电子邮件的主题中。

我正在将 ElmahLog_Logged 事件中提供的 ErrorId ELMAH 保存到会话变量中,正如我在 this question 中发现的那样。 Atif Aziz 本人在this blog post 上评论了与此相关的以下信息:

如果确实想破解邮寄期间记录的错误,可以 必须在 ErrorLogModule.Logged 事件中选择它。这可能是 方便,例如,将记录的错误的 ID 推送到邮件中。 为此,您需要将 Logged 事件中的 Id 隐藏到 HttpContext 并稍后在 Mailing 事件中使用它。为此, 模块将被注册,以便 Mailing 事件 在 Logged 事件之后发生。

我认为由于 httpModules 首先添加了 ErrorLog,然后添加了 ErrorMail,这将实现在 Logged 事件之后注册 Mailing 事件。我想这是在讨论事件的顺序,而不是模块的应用顺序。

如何注册HttpModules的事件顺序?

我试过下面的代码无济于事。下面的代码会阻止电子邮件发送,但错误仍会记录到 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>

...和...

<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>

当然,and 已正确配置(我通过 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_Mailing 事件代码更改为以下代码,我将收到带有 ErrorMail_Mailing 事件代码中指定主题的电子邮件。我什至尝试将 Session.SessionID 放在主题中,这会破坏电子邮件功能。 这让我觉得 ErrorMail_Mailing 事件没有会话访问权限。这是正确的吗?

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

【问题讨论】:

    标签: c# asp.net event-handling httpmodule elmah


    【解决方案1】:

    答案非常简单。 ErrorMailEventsArgs.Error 对象包含异常时的会话信息。 ErrorMail_Mailing 甚至无法访问会话上下文。因此,解决方案就像从 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);
    }
    

    此外,只需将 ElmahId 放入 Session 中的 ErrorLog_Logged 事件中,如果您的 ErrorMail 处理程序在 ErrorLog 之后注册(通过首先在 web.config 中添加 ErrorLog 完成),该会话变量将位于标准 ELMAH 的“会话变量”部分错误电子邮件。

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

    更新: Atif Aziz 指出 Errors.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>
    

    【讨论】:

    • 我建议使用HttpContext.Items 而不是Session 来传递来自LoggedMailed 事件的记录错误ID。
    • 另外,看起来您使用的是 ELMAH 的修补版本,因为官方版本没有任何 SessionVariables 属性关闭 Error 类。
    • 有趣...我从 NuGet 中提取了一个包。现在我想知道是哪一个,我有点喜欢在那里。官方 ELMAH 版本是否将会话变量写入它发送的电子邮件中?我相信我们正在使用的所有安装都在这样做,我只需将条目 ID 放入会话中就可以发现它在来自该电子邮件的电子邮件中。我的目标是通过电子邮件提供的信息轻松访问 elmah.axd 页面。在这种情况下,elmah 在 SQL 中用于 ErrorId 的 GUID 可用于 elmah.axd 处理程序的查询字符串,以直接进入详细信息页面。
    • 你拉取的 NuGet 包的 Id 是什么?检查您的解决方案的packages.config。只有one patch I am aware of by James Manning that adds support for specifically a collection called SessionVariables,但我不相信NuGet 上有。无论如何,最好使用HttpContext.Items,因为无论解决方案中是否启用了会话状态,它都会起作用。
    • 我在上面的答案中添加了这一点。此外,我似乎无法在 ErrorMail_Mailing 事件中访问 HttpContext。该事件触发时为空。是不是我配置不当?
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多