2014-04-01 8 views
27

I zostały wdrożone prosty EmailService dla ASP.NET 2.0 (Identity poprzez interfejs IIdentityMessageServiceAsp.Net Identity 2.0 - jak wdrożyć usługę IIdentityMessageService w celu przeprowadzenia asynchronicznego SMTP przy użyciu 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); 
     } 
    } 
} 

Aby wysłać wiadomość e-mail, idę przez UserManager:

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

Problemem jest to, dostaję System.Threading.Tasks.TaskCanceledException, gdy zadzwonię pod numer SendEmailAsync() i nie jest jasne, dlaczego:

Jeśli wysyłam wiadomości e-mail synchronicznie (client.Send(email)), wigilia rything działa dobrze.

Więc moje pytania to:

  • Jak mogę zapobiec TaskCanceledException z coraz wyrzucony? i (zakładając, że mogę rozwiązać ten błąd),

  • Jak mam iść o komunikowania błędów podczas wysyłanie e-maila do klienta (czyli „nie taki użytkownik tutaj” reakcje typu z smtpclient?

+0

Oto szczegóły odpowiedzieć https://stackoverflow.com/a/45789677/3835843 – Arif

Odpowiedz

30

Twój problem polega na tym SmtpClient jest umieszczony przed e-mail wysyłany jest

dwa sposoby:.

  • poczekać na wynik SendMailAsync

    using (var client = new SmtpClient()) 
    { 
        await client.SendMailAsync(email); 
    } 
    
  • zarejestrować zdarzenie SendCompleted i pozbywania się SmtpClient dopiero po wysłaniu wiadomości

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

nie mogę czekać na SendMailAsync() (przynajmniej nie z zewnątrz trochę więcej gimnastyki), ponieważ IIdentityMessageService.SendAsync () metoda ma typ zwrotu zadania. Ale druga sugestia wygląda na to, że zadziała. Dzięki. –

+7

Możesz oczekiwać metody 'SendMailAsync'. Dodaj 'async' /' await' i nie zwracaj niczego. Kompilator wykona swoją pracę. – meziantou

+4

Zmierzyłem się z tym samym problemem i napisałem pełny opis tutaj: http://blog.falafel.com/avoid-taskcanceledexception-sending-email-async/ – ssmith

5

Musisz umieścić asynchronicznie na metodzie.

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); 
       } 
      } 
     } 
    } 
Powiązane problemy