gpt4 book ai didi

c# - 如何将 SQL ELMAH_Error.ErrorID 附加到 ELMAH 错误电子邮件主题?

转载 作者:太空狗 更新时间:2023-10-30 01:08:44 25 4
gpt4 key购买 nike

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

我正在将 ElmahLog_Logged 事件中提供的 ErrorId ELMAH 保存到 session 变量中,正如我在 this question 中发现的那样. Atif Aziz 本人对 this blog post 发表了评论有关此的以下信息:

If one does want a crack at the logged Error during mailing, one would have to pick it up in the ErrorLogModule.Logged event. This could be handy, for example, to push the Id of the logged error into the mail. To do that, you'd stash away the Id from the Logged event into the HttpContext and use it later in the Mailing event. For this to work, the modules would have be registered such that the Mailing event occurs after the Logged event.

我认为,由于 httpModules 是先添加 ErrorLog,再添加 ErrorMail,这样就可以实现在 Logged 事件之后注册 Mailing 事件。我想这是在谈论事件的顺序,而不是模块的应用顺序。

如何注册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 安装)。

全局.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 事件没有 Session 访问权限。这是正确的吗?

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

最佳答案

答案非常简单。 ErrorMailEventsArgs.Error 对象包含异常时的 session 信息。 ErrorMail_Mailing 甚至无权访问 session 上下文。因此,解决方案就像从 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 放入 ErrorLog_Logged 事件的 Session 中,如果您的 ErrorMail 处理程序是在 ErrorLog 之后注册的(通过首先在 web.config 中添加 ErrorLog 来完成),该 session 变量将位于标准 ELMAH 的 session 变量部分错误邮件。

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>

关于c# - 如何将 SQL ELMAH_Error.ErrorID 附加到 ELMAH 错误电子邮件主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8598992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com