net mvc example asp asp.net asp.net-mvc asynchronous smtp smtpclient

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?