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?
Ответы
Ответ 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);
}
}
}
}