Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 使用MvcMailer发送异步电子邮件时记录错误_Asp.net Mvc 3_Mvcmailer - Fatal编程技术网

Asp.net mvc 3 使用MvcMailer发送异步电子邮件时记录错误

Asp.net mvc 3 使用MvcMailer发送异步电子邮件时记录错误,asp.net-mvc-3,mvcmailer,Asp.net Mvc 3,Mvcmailer,我正在使用优秀的软件包从我的应用程序中发送电子邮件。 我正在使用SendAsync()方法发送电子邮件,并希望记录错误并处理附件,即 MailMessage message = UserMailer.SendSomeEmail(emailViewModel); var client = new SmtpClientWrapper(); client.SendCompleted += (sender, e) => {

我正在使用优秀的软件包从我的应用程序中发送电子邮件。 我正在使用SendAsync()方法发送电子邮件,并希望记录错误并处理附件,即

MailMessage message = UserMailer.SendSomeEmail(emailViewModel);

        var client = new SmtpClientWrapper();
        client.SendCompleted += (sender, e) =>
        {
            if (e.Error != null || e.Cancelled)
            {
                Logger.LogError(e.Error);
            }
            if (message != null)
            {
                message.Attachments.Dispose();
                message.Dispose();
            }
            client.Dispose();
        };
        message.SendAsync("this means nothing afaik", client);
这很管用,但当我需要发送电子邮件时,在服务器上重复同样的代码片段会让我非常痛苦


我应该如何设置它,以便在异步调用完成时记录任何错误并处理邮件附件?一定有更好的办法

如果您想避免每次发送异步电子邮件时都要编写日志记录和清理代码,那么答案很简单——停止使用匿名方法。只需将当前代码放入如下常规方法中:

public void AsyncSendCompleted(object sender, EventArgs e) 
{
  // Use an appropriate type instead of EventArgs so you can get
  // stuff like e.Cancelled and e.Error

  // The rest of your code goes here
}
现在将此方法用作SendCompleted事件的事件处理程序:

client.SendCompleted += AsyncSendCompleted;

谢谢我还试图以干式方式处理MailMessage对象+添加eventhandler,但我想如果不修改MvcMailer源代码本身,这是不可能的。您应该使用
using
块来处理该处理。如果确实需要使添加事件处理程序变得可重复,可以考虑使用工厂模式。只要把你在工厂里需要的东西都装上电线就行了。