每当我从ASP.NET MVC应用程序中调用smtpClient.SendAsync(...)
时,即使永远不会调用SendAsyncCancel()
,也会自动取消异步请求。
同步 .Send(...)
请求通过就好了。
我的EmailService
服务包装器处理从我的ASP.NET MVC 3应用程序中发送带有SmtpClient
的异步电子邮件。 StructureMap将一个服务实例注入到每个MVC控制器中,它将一个新的SmtpClient
实例包装在using (...) { }
语句中。
以下是EmailService.SendAsync
的{{1}}包装方法:
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
为什么异步电子邮件被取消,但同步电子邮件通过正常?这可能是一个处置问题吗?
答案 0 :(得分:12)
绝对可以解决这个问题。当您处置客户端时,它会取消任何未完成的异步操作。
您应该将客户端部署在Email_OnCompleted
。
关于在何处处置的SO帖子:Dispose SmtpClient in SendComplete?