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));
}
}
爲什麼異步電子郵件被取消,但同步電子郵件經歷就好了?它可能是一個處置問題?
太棒了!我扯掉了使用(...)語句,異步發送現在完美地工作。謝謝,安德斯! –
在異步發送完成之前,是否有可能將控制器和_logger一起處置,導致ILogger實例上出現空引用異常? –
更準確地說......「當您處理客戶端時,它會取消所有未完成的異步操作。」 =當你處理SmtpClient時,它將取消該類實例的任何未完成的異步操作。 –