Asp.Net Identity 2.0 – 如何使用SmtpClient实现IIdentityMessageService来执行异步SMTP?
我已经为Asp.Net Identity 2.0实现了一个简单的EmailService(通过IIdentityMessageService接口。
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: link");
问题是,当我调用SendEmailAsync()
时,我得到一个System.Threading.Tasks.TaskCanceledException
,并且不清楚为什么。
如果我同步发送电子邮件( 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);
您必须在方法上放置异步。
public async Task SendAsync(IdentityMessage message) { using (SmtpClient client = new SmtpClient()) { using (var mailMessage = new MailMessage("your@email.com", message.Destination, message.Subject, message.Body)) { await client.SendMailAsync(mailMessage); } } } }
- 在ASP.NET身份中获取使用Microsoft帐户进行身份validation的用户的电子邮件
- 具有特殊字符的ASP.NET MVC标识电子邮件/用户名
- 如何在ASP .NET MVC 5中为AspNetUser创建SecurityStamp
- 如何删除dbo.AspNetUserClaims和dbo.AspNetUserLogins表(IdentityUserClaim和IdentityUserLogin实体)?
- 如何在ASP.NET标识中创建不同的用户类型?
- 如何解决ASP.NET MVC Kendo UI网格中的CRUD操作问题
- 如何用asp.net身份创建交易?
- 从基础asp.net标识用户创建inheritance用户
- OpenIdConnectAuthenticationHandler:message.State为null或为空