Подтвердить что ты не робот

Asp.Net Identity 2.0 - Как реализовать программу IIdentityMessageService для работы с Async SMTP с использованием SmtpClient?

Я реализовал простой EmailService для Asp.Net Identity 2.0 (через интерфейс 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);
        }
    }
}

Чтобы отправить электронное письмо, я просматриваю UserManager:

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

Проблема в том, что я получаю System.Threading.Tasks.TaskCanceledException, когда я вызываю SendEmailAsync(), и это не понятно, почему.

Если я отправляю электронное письмо синхронно (client.Send(email)), все работает нормально.

Итак, мои вопросы:

  • Как избежать исключения TaskCanceledException? и (если я могу преодолеть эту ошибку),

  • Как я могу обмениваться ошибками при отправке электронной почты обратно клиенту (т.е. ответы типа "нет такого пользователя здесь" от SmtpClient?

4b9b3361

Ответ 1

Ваша проблема в том, что SmtpClient удаляется до отправки сообщения электронной почты.

Два способа:

  • Ожидание результата SendMailAsync

    using (var client = new SmtpClient())
    {
        await client.SendMailAsync(email);
    }
    
  • Зарегистрируйте событие SendCompleted и удалите SmtpClient только после отправки сообщения

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

Ответ 2

Вы должны поместить метод async.

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