2011-11-29 60 views
8

每当我从我的ASP.NET MVC应用程序中调用smtpClient.SendAsync(...)时,即使从未调用SendAsyncCancel(),异步请求也会自动取消。SmtpClient.SendAsync调用自动取消

Synchronous.Send(...)另一方面,请求通过就好了。

我的EmailService服务包装处理从我的ASP.NET MVC 3应用程序中发送带有SmtpClient的异步电子邮件。通过StructureMap将服务实例注入到每个MVC控制器中,该实例在using (...) { }语句中包装新的SmtpClient实例。

这里是我的SmtpClient包装EmailService.SendAsync方法:

public void SendAsync(EmailMessage message) 
{ 
    try 
    { 
     using (var smtpClient = new SmtpClient(_cfg.Host, _cfg.Port) 
     { 
      EnableSsl = _cfg.EnableSsl, 
      Credentials = _credentials 
     }) 
     { 
      smtpClient.SendCompleted += new SendCompletedEventHandler(Email_OnCompleted); 

      var mailMessage = new MailMessage(message.From, message.To) 
           { 
            Subject = message.Subject, 
            Body = message.Body 
           }; 

      smtpClient.SendAsync(mailMessage, message); 

      _logger.Info(string.Format("Sending async email to {0} with subject [{1}]", message.To, message.Subject)); 
     } 
    } 
    catch (Exception ex) 
    { 
     _logger.Error("Async email error: " + ex); 
     throw; 
    } 

} 

这里是我的Email_OnCompleted委托:

public void Email_OnCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    var mail = (EmailMessage)e.UserState; 

    if (e.Error != null) 
    { 
     _logger.Error(string.Format("Error sending email to {0} with subject [{1}]: {2}", mail.To, mail.Subject, e.Error)); 
    } 
    else if (e.Cancelled) 
    { 
     _logger.Warn(string.Format("Cancelled email to {0} with subject [{1}].", mail.To, mail.Subject)); 
    } 
    else 
    { 
     _logger.Info(string.Format("Sent email to {0} with subject [{1}].", mail.To, mail.Subject)); 
    } 
} 

为什么异步电子邮件被取消,但同步电子邮件经历就好了?它可能是一个处置问题?

回答

12

它肯定是一个处置问题。当您处理客户端时,它会取消所有未完成的异步操作。

您应该将客户置于Email_OnCompleted

一个SO帖子在哪里可以处理:Dispose SmtpClient in SendComplete?

+2

太棒了!我扯掉了使用(...)语句,异步发送现在完美地工作。谢谢,安德斯! –

+0

在异步发送完成之前,是否有可能将控制器和_logger一起处置,导致ILogger实例上出现空引用异常? –

+1

更准确地说......“当您处理客户端时,它会取消所有未完成的异步操作。” =当你处理SmtpClient时,它将取消该类实例的任何未完成的异步操作。 –