Asp.net
自動取消 SmtpClient.SendAsync 呼叫
每當我
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?