SmtpClient.SendAsync调用自动取消

时间:2011-11-29 19:48:29

标签: asp.net asp.net-mvc asynchronous smtp smtpclient

每当我从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

为什么异步电子邮件被取消,但同步电子邮件通过正常?这可能是一个处置问题吗?

1 个答案:

答案 0 :(得分:12)

绝对可以解决这个问题。当您处置客户端时,它会取消任何未完成的异步操作。

您应该将客户端部署在Email_OnCompleted

关于在何处处置的SO帖子:Dispose SmtpClient in SendComplete?