我正在实施一周前发布的新版ASP.NET Identity 2.0。
IdentityConfig.cs正在完成其工作,用户的信息被添加到数据库中,并且向用户发送电子邮件以进行确认。一切都很好,但是这个错误是不必要的(这听起来像是脚本之间的竞争)。它只在我使用电子邮件服务时被解雇:
An asynchronous module or handler completed while an asynchronous operation was still pending
背后的代码如下:
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
var mailMessage = new MailMessage(
"******@d******.com",
message.Destination,
message.Subject,
message.Body
);
// Send the message
SmtpClient client = new SmtpClient();
client.SendAsync(mailMessage, null);
return Task.FromResult(0);
}
}
我该如何解决这个问题?
提前致谢。
答案 0 :(得分:0)
SendAsync()
需要await
ed ...
public async Task SendAsync(IdentityMessage message)
{
var mailMessage = new MailMessage(
"******@d******.com",
message.Destination,
message.Subject,
message.Body
);
// Send the message
SmtpClient client = new SmtpClient();
await client.SendMailAsync(mailMessage);
}
答案 1 :(得分:0)
当您致电client.SendAsync
时,它会在后台启动一个线程来发送电子邮件,但您的方法会返回一个立即完成的任务。抛出此异常是因为您应该进行某种同步,以确保在发送电子邮件的后台线程完成之前,您返回的任务未完成。
但是,您不需要首先创建后台进程。您的方法已经是异步的,因此调用方法将一直阻塞直到它完成。只需使用Send
代替SendAsync
即可。您还应该使用using
块来确保正确放置SMTP客户端。
以下是一个示例实现:
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
var mailMessage = new MailMessage(...);
return Task.Run(() =>
{
using (var client = new SmtpClient())
{
try
{
client.Send(mailMessage);
}
catch(Exception e)
{
//log error
throw;
}
}
});
}
}
答案 2 :(得分:-1)
更改行:
client.SendAsync(mailMessage, null);
为:
client.Send(mailMessage);