我已经为 Asp.Net Identity 2.0 实现了一个简单的 EmailService(通过 IIdentityMessageService
接口(interface)。
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// convert IdentityMessage to a MailMessage
var email =
new MailMessage(new MailAddress("noreply@mydomain.com", "(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 的“此处没有这样的用户”类型的响应?
最佳答案
您的问题是 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);
关于c# - Asp.Net Identity 2.0 - 如何实现 IIdentityMessageService 以使用 SmtpClient 执行异步 SMTP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22797845/