SmtpClient.SendAsync Вызовы автоматически отменяются - PullRequest
8 голосов
/ 29 ноября 2011

Всякий раз, когда я вызываю smtpClient.SendAsync(...) из моего приложения ASP.NET MVC, асинхронные запросы автоматически отменяются, даже если SendAsyncCancel() никогда не вызывается.

Синхронный .Send(...)запросы, с другой стороны, проходят очень хорошо.

My EmailService Оболочка службы обрабатывает отправку асинхронной электронной почты с SmtpClient из моего приложения ASP.NET MVC 3.Экземпляр службы внедряется в каждый контроллер MVC с помощью StructureMap, который оборачивает новый экземпляр SmtpClient в оператор using (...) { }.

Вот мой EmailService.SendAsync метод оболочки для 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 делегат:

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));
    }
}

Почему асинхронные электронные письма отменяются, но синхронные электронные письма проходят нормально?Может ли это быть проблема утилизации?

1 Ответ

12 голосов
/ 29 ноября 2011

Это определенно может быть проблема утилизации.Когда вы распоряжаетесь клиентом, он отменяет все незавершенные асинхронные операции.

Вы должны расположить клиента в Email_OnCompleted.

SO-сообщение о том, где распоряжаться: Уничтожить SmtpClient в SendComplete?

...