System.Web.HttpContext.Current.IsDebuggingEnabled
无论如何,如果是真的,所有电子邮件都会转到不同的地址吗?或者我需要一个新的类来在任何地方发送电子邮件?
5 回答
我会设置一个 SMTP 服务器并让您的 webapp 将其用作其外发邮件服务器(在某种配置中指定)。对于生产站点,服务器会正常运行,但对于调试,您可以配置 SMTP 服务器以将所有邮件路由到您选择的地址。这具有根本不更改您的应用程序的优点,如果更改行为可以防止发生您试图重现的错误等,这可能很有用。我的公司使用这种方法进行质量检查并且效果很好。
你可以把它放在你使用它的任何地方的代码中:
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
{
mail.To = "debug@debug.com";
}
else
{
mail.To = recipientAddress;
}
或者只是为获取电子邮件地址构建一个简单的包装器(即使是收件人地址的方法的 getter 中的某些东西也可以),或者为整个 smtpclient 或 mailmessage 类构建一个包装器。
老实说,我用好旧的
#if DEBUG
Mail.To("debug@debugaddress.com");
#else
Mail.To("actualrecipient@destinationaddress.com");
#endif
为了阻止我在生产应用程序中浮动调试代码。我用于数据库访问的一种方法是使用 dns 条目,即 database1.domain.com,在我的开发机器上的主机文件中它指向我的本地系统,在我的生产机器上它指向数据库服务器。您可以使用类似的东西来拥有一个调试邮件服务器和一个生产邮件服务器,但与上面的第一个解决方案相比,它似乎有点过分了。
我认为处理这个问题的最好方法是通过邮件客户端的代理类。创建代理类时,使用参数指示是否在调试模式下运行。让代理支持与邮件客户端相同的接口,但在调试模式下运行时静默替换外发电子邮件地址。
public class MailProxy
{
private bool IsDebug { get; set; }
private string DebugAddress { get; set; }
private SmtpClient Client { get; set; }
public MailProxy( SmtpClient client,
bool debugging,
string debugAddress )
{
this.IsDebug = debugging;
this.DebugAddress = debugAddress;
}
public void Send( MailMessage message )
{
if (this.IsDebug)
{
message.To = new MailAddress(this.DebugAddress);
}
this.Client.Send( message );
}
...
}
我们使用与 tvanfosson 详述的 MailProxy 方法类似的解决方案。然而,我们有一些我觉得值得一提的差异。第一个是我们在开发或测试环境中简单地扩展 SmtpClient 类并覆盖 Send 方法。我们使用配置文件来确定环境。然后我们在需要发送电子邮件的任何时候使用这个类。此类将确定谁当前登录到应用程序,并将生成的所有电子邮件重定向到他们,如果登录用户由于某种原因不可用,则故障转移到标准收件人列表。如果您有几个人正在测试或开发,这会有所帮助,因为他们只会收到他们生成的电子邮件。我们还将邮件的原始收件人添加到邮件正文中。这在测试工作流类型消息以确保它们发送给正确的个人时再次很有用。最后,我发现在邮件主题中添加 [DEV] 或 [QA] 标记很有用,这样我就可以在我的邮件客户端中设置一个规则来处理所有测试邮件。