asp.net - mvc - SmtpClient.SendAsync Las llamadas se cancelan automáticamente
asp.net mvc send email (1)
Definitivamente puede ser un problema de eliminación. Cuando desecha el cliente, cancela cualquier operación asíncrona pendiente.
Debe deshacerse del cliente en Email_OnCompleted
.
Una publicación de SO sobre dónde desechar: ¿ Desechar SmtpClient en SendComplete?
Cada vez que llamo a smtpClient.SendAsync(...)
desde mi aplicación ASP.NET MVC, las solicitudes asíncronas se cancelan automáticamente, aunque SendAsyncCancel()
nunca se SendAsyncCancel()
.
Las .Send(...)
sincrónicas de .Send(...)
, por otro lado, pasan muy bien.
El EmailService
servicios de mi EmailService
maneja el envío de correo electrónico asíncrono con SmtpClient
desde mi aplicación ASP.NET MVC 3. Una instancia de servicio es inyectada en cada controlador MVC por StructureMap, que envuelve una nueva instancia SmtpClient
en una SmtpClient
using (...) { }
.
Aquí está mi método de envoltura SmtpClient
para 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;
}
}
Aquí está mi delegado 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));
}
}
¿Por qué se cancelan los correos electrónicos asincrónicos, pero los correos electrónicos síncronos funcionan bien? ¿Podría ser un problema de disposición?