我有一个使用ELMAH来记录未处理异常的 Azure Web 应用程序。
当我第一次部署它时,web.config 中定义了完整的 SMTP 设置,并且 ELMAH 通过电子邮件发送了例外情况:
<system.net>
<mailSettings>
<smtp from="me@mydomain.com">
<network host="smtp.mailprovider.com"
port="123"
userName="myUserName"
password="p@ssw0rd" />
</stmp>
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)
此后,用户名和密码已从 web.config 中删除,它们现在存储为应用程序设置,通过 Azure 门户进行配置。
我发送的大多数电子邮件仍然可以正常工作,因为电子邮件代码可以访问这些应用程序设置并在实例化时使用它们SmtpClient,例如:
var userName = WebConfigurationManager.AppSettings["smtp.userName"];
var password = WebConfigurationManager.AppSettings["smtp.password"];
var credentials = new NetworkCredential(userName, password);
using (var smtpClient = new SmtpClient { Credentials = credentials })
{
await smtpClient.SendMailAsync(mailMessage);
}
Run Code Online (Sandbox Code Playgroud)
让 ELMAH 使用应用程序设置中存储的凭据的最佳方法是什么?
我可以看到的选项:
我最终创建了 Elmah 的自定义版本ErrorMailModule,它源自标准版本,但SendMail根据 Atif Aziz 在Google 网上论坛讨论中的一些建议重写了该方法。
唯一需要的更改是创建新模块,并将其切换Web.Config为使用自定义模块而不是标准模块。
using System;
using System.Net.Mail;
namespace Test
{
public class ErrorMailModule : Elmah.ErrorMailModule
{
protected override void SendMail(MailMessage mail)
{
if (mail == null) throw new ArgumentNullException(nameof(mail));
// do what you want with the mail
// (in my case this fires up the email service, which
// gets the credentials from the Azure settings)
}
}
}
Run Code Online (Sandbox Code Playgroud)
所需要做的就是将两次出现的 更改Elmah.ErrorLogModule, Elmah为您自己的模块,在本例中为Test.ErrorMailModule。
所以,而不是这个...
<system.web>
<httpModules>
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
...你现在应该有这个:
<system.web>
<httpModules>
<add name="ErrorMail" type="Test.ErrorMailModule" />
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorMail" type="Test.ErrorMailModule" preCondition="managedHandler" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
您仍然需要该errorMail部分,因为 Elmah 仍然负责创建电子邮件。我的看起来像这样:
<elmah>
<errorMail from="user@domain.com" to="user@domain.com" subject="Custom Email Module"/>
</elmah>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |