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时,它将取消该类实例的任何未完成的异步操作。 –