SmtpClient.SendAsync调用自动取消



每当我在ASP中调用smtpClient.SendAsync(...)时。. NET MVC应用程序,异步请求被自动取消,即使SendAsyncCancel()从未被调用。

另一方面,同步 .Send(...)请求可以顺利通过。

我的EmailService服务包装器处理发送异步电子邮件与SmtpClient从我的ASP。asp.net MVC 3应用程序。服务实例通过StructureMap注入到每个MVC控制器中,它在using (...) { }语句中封装了一个新的SmtpClient实例。

下面是SmtpClientEmailService.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));
    }
}

为什么异步邮件被取消了,而同步邮件却顺利通过?这是一个处理问题吗?

这肯定是一个处理问题。当你处理客户端时,它会取消所有未完成的异步操作。

您应该在Email_OnCompleted中处置客户端。

一个SO帖子在哪里处置:处置SmtpClient在SendComplete?

最新更新