Всякий раз, когда я вызываю 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));
}
}
Почему асинхронные электронные письма отменяются, но синхронные электронные письма проходят нормально?Может ли это быть проблема утилизации?