【问题标题】:Asp.Net Identity 2.0 - How to Implement IIdentityMessageService to do Async SMTP using SmtpClient?Asp.Net Identity 2.0 - 如何实现 IIdentityMessageService 使用 SmtpClient 执行异步 SMTP?
【发布时间】:2014-05-12 22:23:37
【问题描述】:

我已经为 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: <a href=\"" + callbackUrl + "\">link</a>");

问题是当我打电话给SendEmailAsync() 时,我得到了一个System.Threading.Tasks.TaskCanceledException,目前还不清楚为什么。

如果我同步发送电子邮件 (client.Send(email)),一切正常。

所以我的问题是:

  • 如何防止 TaskCanceledException 被抛出? 并且(假设我可以克服这个错误),

  • 在将电子邮件发送回客户端期间,我应该如何处理通信错误(即,“这里没有这样的用户”类型的来自 SmtpClient 的响应?

【问题讨论】:

标签: c# asp.net-identity 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);
    

【讨论】:

  • 我不能等待 SendMailAsync() (至少没有更多的体操),因为 IIdentityMessageService.SendAsync() 方法的返回类型为 Task。但第二个建议看起来会奏效。谢谢。
  • 您可以等待SendMailAsync 方法。添加async/await 并且不返回任何内容。编译器会完成他的工作。
  • 我遇到了同样的问题并在这里写了一个完整的描述:blog.falafel.com/…
  • 如果我将client设为静态会怎样?
  • 在这种情况下,您需要确保所有SendMailAsync 都已完成,然后再处理客户端。您可以针对您的代码提出新问题,以便我们为您提供帮助。
【解决方案2】:

你必须把异步放在方法上。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2015-07-21
    • 2023-03-23
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多