2011-11-29 63 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時,它將取消該類實例的任何未完成的異步操作。 –