web-dev-qa-db-fra.com

Asp.Net Identity 2.0 - Comment implémenter IIdentityMessageService pour faire Async SMTP en utilisant SmtpClient?

J'ai implémenté un simple EmailService pour Asp.Net Identity 2.0 (via l'interface IIdentityMessageService.

    public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        // convert IdentityMessage to a MailMessage
        var email = 
           new MailMessage(new MailAddress("[email protected]", "(do not reply)"), 
           new MailAddress(message.Destination))
        {
            Subject = message.Subject,
            Body = message.Body,
            IsBodyHtml = true
        };

        using (var client = new SmtpClient()) // SmtpClient configuration comes from config file
        {
            return client.SendMailAsync(email);
        }
    }
}

Pour envoyer un e-mail, je passe par UserManager:

await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");

Le problème est que j'obtiens un System.Threading.Tasks.TaskCanceledException Lorsque j'appelle SendEmailAsync() et on ne sait pas pourquoi.

Si j'envoie un e-mail de manière synchrone (client.Send(email)), tout fonctionne bien.

Mes questions sont donc:

  • Comment empêcher la levée de TaskCanceledException? et (en supposant que je peux surmonter cette erreur),

  • Comment dois-je procéder pour communiquer les erreurs lors de l'envoi d'un e-mail au client (c'est-à-dire, "aucun utilisateur de ce type ici" de type SmtpClient?

27
Mr. T

Votre problème est que SmtpClient est supprimé avant l'envoi de l'e-mail.

Deux façons:

  • Attendre le résultat SendMailAsync

    using (var client = new SmtpClient())
    {
        await client.SendMailAsync(email);
    }
    
  • Enregistrez l'événement SendCompleted et supprimez le SmtpClient uniquement après l'envoi du message

    var client = new SmtpClient();
    client.SendCompleted += (s, e) => {
        client.Dispose();
    };
    return client.SendMailAsync(message);
    
30
meziantou

Vous devez mettre async sur la méthode.

    public async Task SendAsync(IdentityMessage message)
    {
        using (SmtpClient client = new SmtpClient())
        {
                using (var mailMessage = new MailMessage("[email protected]", message.Destination, message.Subject, message.Body))
                {
                    await client.SendMailAsync(mailMessage);
                }
            }
        }
    }
6
Marcelo Gondim