2014-04-01 5 views
27

मैं IIdentityMessageService इंटरफ़ेस के माध्यम से Asp.Net पहचान 2.0 (के लिए एक सरल EmailService को क्रियान्वित किया हैAsp.Net पहचान 2.0 - SmtpClient का उपयोग करते हुए Async SMTP करने के लिए IIdentityMessageService को कार्यान्वित कैसे करें? ।

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

एक ईमेल भेजने के लिए, मैं UserManager के माध्यम से जाना:

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

समस्या है कि मुझे System.Threading.Tasks.TaskCanceledException मिलता है जब मैं SendEmailAsync() पर कॉल करता हूं और यह स्पष्ट नहीं है कि

यदि मैं सिंक्रनाइज़ ईमेल भेजता हूं (client.Send(email)), पूर्व संध्या rything ठीक काम करता है।

तो मेरी प्रश्न हैं:

  • मैं फेंक दिया हो रही TaskCanceledException को कैसे रोकूं? और (यह मानते हुए मैं यह त्रुटि दूर कर सकते हैं),

  • मैं कैसे ईमेल SmtpClient से यानी, "यहाँ ऐसी कोई उपयोगकर्ता" प्रकार की प्रतिक्रियाएं ग्राहक को वापस भेजने (के दौरान त्रुटियों से संवाद स्थापित करने के बारे में जाना चाहिए?

+0

यहाँ अपने विवरण https://stackoverflow.com/a/45789677/3835843 – Arif

उत्तर

30

आपका समस्या यह है कि 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); 
    
+0

का जवाब मैं SendMailAsync (इंतजार नहीं कर सकते हैं) (बाहर कुछ और जिमनास्टिक के साथ कम से कम नहीं) है, क्योंकि IIdentityMessageService.SendAsync () विधि में कार्य का एक प्रकार है। लेकिन दूसरा सुझाव ऐसा लगता है कि यह काम करने जा रहा है। धन्यवाद। –

+7

आप 'SendMailAsync' विधि का इंतजार कर सकते हैं। 'Async'/'प्रतीक्षा करें' जोड़ें और कुछ भी वापस न करें। संकलक अपना काम करेगा। – meziantou

+4

मुझे इस मुद्दे का सामना करना पड़ा और यहां एक पूर्ण विवरण लिखा: http://blog.falafel.com/avoid-taskcanceledexception-sending-email-async/ – ssmith

5

आप पद्धति पर async डाल चाहिए प्रतीक्षा।

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); 
       } 
      } 
     } 
    } 
संबंधित मुद्दे