Asp.net

自動取消 SmtpClient.SendAsync 呼叫

  • November 29, 2011

每當我smtpClient.SendAsync(...)從我的 ASP.NET MVC 應用程序中呼叫時,非同步請求都會自動取消,即使SendAsyncCancel()從未呼叫過。

.Send(...)另一方面,同步請求可以順利通過。

我的EmailService服務包裝器處理SmtpClient從我的 ASP.NET MVC 3 應用程序中發送非同步電子郵件。StructureMap 將一個服務實例注入到每個 MVC 控制器中,它將一個新SmtpClient實例包裝在一個using (...) { }語句中。

這是我的EmailService.SendAsync包裝方法SmtpClient

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));
   }
}

為什麼非同步郵件被取消了,而同步郵件卻正常通過?這可能是一個處置問題嗎?

這絕對是一個處置問題。當您處置客戶端時,它會取消任何未完成的非同步操作。

您應該在Email_OnCompleted.

關於在哪里處置的 SO 文章:在 SendComplete 中處置 SmtpClient?

引用自:https://stackoverflow.com/questions/8316785