2014-04-01 20 views
27

Tôi đã thực hiện một EmailService đơn giản cho Asp.Net nhận dạng 2.0 (thông qua giao diện IIdentityMessageServiceAsp.Net Identity 2.0 - Cách triển khai IIdentityMessageService để thực hiện Async SMTP bằng SmtpClient? .

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

Để gửi email, tôi đi qua UserManager:

await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");

Vấn đề là mà tôi nhận được một System.Threading.Tasks.TaskCanceledException khi tôi gọi SendEmailAsync() và nó không rõ tại sao.

Nếu tôi gửi email đồng bộ (client.Send(email)), eve rything hoạt động tốt.

Vì vậy, câu hỏi của tôi là:

  • Làm thế nào để ngăn chặn sự TaskCanceledException khỏi bị ném? và (giả sử tôi có thể khắc phục được lỗi này),

  • Làm thế nào tôi nên đi về giao tiếp sai sót trong quá email gửi lại cho khách hàng (ví dụ, "không có người dùng như vậy ở đây" phản ứng loại từ SmtpClient?

+0

Dưới đây là chi tiết của bạn trả lời https://stackoverflow.com/a/45789677/3835843 – Arif

Trả lời

30

vấn đề của bạn là SmtpClient được xử lý trước khi email được gửi

Hai cách:.

  • Chờ các SendMailAsync kết quả

    using (var client = new SmtpClient()) 
    { 
        await client.SendMailAsync(email); 
    } 
    
  • Đăng ký sự kiện SendCompleted và xử lý các SmtpClient chỉ sau khi tin nhắn được gửi

    var client = new SmtpClient(); 
    client.SendCompleted += (s, e) => { 
        client.Dispose(); 
    }; 
    return client.SendMailAsync(message); 
    
+0

Tôi không thể chờ đợi sự SendMailAsync() (ít nhất là không phải với một số thể dục nhiều hơn) vì IIdentityMessageService.SendAsync () có một kiểu trả về của Task. Nhưng gợi ý thứ hai có vẻ như nó sẽ hoạt động. Cảm ơn. –

+7

Bạn có thể đợi phương thức 'SendMailAsync'. Thêm 'async' /' await' và không trả lại bất kỳ thứ gì. Trình biên dịch sẽ thực hiện công việc của anh ta. – meziantou

+4

Tôi phải đối mặt với cùng một vấn đề này và đã viết một mô tả đầy đủ ở đây: http://blog.falafel.com/avoid-taskcanceledexception-sending-email-async/ – ssmith

5

Bạn phải đặt async về phương pháp.

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); 
       } 
      } 
     } 
    } 
Các vấn đề liên quan