2017-01-26 9 views
0

У меня есть действие асинхронного в контроллере, который похож на этомстранного поведение асинхронного или не асинхронное действие контроллера при отправке по электронной почте MVC 5

public async Task<ActionResult> Register(MerchantRegistrationViewModel merchantRegistrationViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //Some code 

     //SendMail 
     EmailManager em = new EmailManager("MerchantVerify.htm",merchant,"Verify Email"); 
     await em.SendEmailAsync(); 


     db.Merchants.Add(merchant); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Success"); 

    }   
} 

код в методе em.SendEmailAsync()

public async Task SendEmailAsync() 
{ 
    GetEmailTemplate(); 

    var emailBody = BuildEmailBodyForVerifyMerchant(); 

    var emailToSend = BuildEmailMessage(emailBody, subject); 

    var client = new SmtpClient(); 
    await client.SendMailAsync(emailToSend); 
} 

Проблема Я заметил, что это метод GetEmailTemplate(), который содержит этот кодовый блок

private void GetEmailTemplate() 
{ 
    //Tried Option 1 
    //mailBody = System.IO.File.ReadAllText(HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate)); 

    //Tried Option 2 
    using (FileStream fs = new FileStream(HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate), FileMode.Open)) 
    using (StreamReader sr = new StreamReader(fs)) 
    { 
     mailBody = sr.ReadToEnd(); 
    } 

} 

Если я комментирую этот блок кода, и я изменяю действие на асинхронный или неасинхронный, я получаю отправленное электронное письмо. Если я раскомментирую любую из опций, почта не будет получена. У меня нет ошибок.

Я подозреваю, что это связано с тем, как я читаю файл шаблона.

public class EmailManager 
{ 
    private string mailTemplate; 
    private Merchant merchant; 
    private string mailBody = string.Empty; 
    private string subject; 

    public EmailManager() 
    { 

    } 

    public EmailManager(string mailTemplate, Merchant merchant, string subject) 
    { 
     this.mailTemplate = mailTemplate; 
     this.merchant = merchant; 
     this.subject = subject; 
    } 

    private void GetEmailTemplate() 
    { 
     //Get Mail Text Path 
     //mailBody = System.IO.File.ReadAllText(HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate)); 
     using (FileStream fs = new FileStream(HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate),FileMode.Open ,FileAccess.Read, FileShare.Read)) 
     using (StreamReader sr = new StreamReader(fs)) 
     { 
      mailBody = sr.ReadToEnd(); // 1 
     }   
    } 


    private string BuildEmailBodyForVerifyMerchant() 
    { 
     //Replace Custom Variables for Email Body 
     Uri url = System.Web.HttpContext.Current.Request.Url; 
     string UrlLink = url.OriginalString.Replace(url.PathAndQuery, ""); 
     merchant.ProviderUserKey = Guid.NewGuid().ToString(); 
     UrlLink = String.Concat(UrlLink, "/"); 
     var verifyUrl = UrlLink + "business/verify/" + merchant.ProviderUserKey.ToString(); 

     //replace variables 
     mailBody = mailBody.Replace("~userLastName~", merchant.Name); 
     mailBody = mailBody.Replace("~name~", String.Format("{0} {1}", merchant.FirstName, merchant.LastName)); 
     mailBody = mailBody.Replace("~companyName~", merchant.Name); 
     mailBody = mailBody.Replace("~dateOfRegistration~", merchant.DateOfRegistration.Value.ToShortDateString()); 
     mailBody = mailBody.Replace("~verifyUrl~", verifyUrl); 
     mailBody = mailBody.Replace("~email~", merchant.Email); 

     return mailBody; 
    } 

    private MailMessage BuildEmailMessage(string body, string subject) 
    { 
     MailMessage msg = new MailMessage(); 

     msg.From = new MailAddress("[email protected]"); 
     msg.To.Add(new MailAddress(merchant.Email.ToString()));   
     msg.Subject = subject; 
     msg.Body = body; 

     return msg; 
    } 


    public async Task SendEmailAsync() 
    { 
     GetEmailTemplate(); 

     var emailBody = BuildEmailBodyForVerifyMerchant(); 

     var emailToSend = BuildEmailMessage(emailBody, subject); 

     var client = new SmtpClient(); 
     await client.SendMailAsync(emailToSend); 
    } 


} 
+0

Есть ли [это] (http://stackoverflow.com/a/19976673/11683) что-то изменить? – GSerg

+0

Ваша фразировка немного запутанна (для меня в любом случае), поэтому просто чтобы быть понятным - вы говорите, если вы закомментируете строку 'GetEmailTemplate();', почта отправляет, а если нет, это не так? – sellotape

+0

@sellotape - либо строка, либо код в этом методе. –

ответ

0

Вот рефакторинг из EmailManager данных представленных в примере ОП. Методы были реорганизованы для лучшего выражения их зависимостей и, надеюсь, помогут изолировать то, что может вызвать проблему в методе GetEmailTemplate.

public interface IEmailManager { 
    Task SendEmailAsync(); 
} 

public class EmailManager : IEmailManager { 
    private string mailTemplate; 
    private Merchant merchant; 
    private string subject; 

    public EmailManager(string mailTemplate, Merchant merchant, string subject) { 
     this.mailTemplate = mailTemplate; 
     this.merchant = merchant; 
     this.subject = subject; 
    } 

    private async Task<string> GetEmailTemplateAsync(string mailTemplate) { 
     var mailBody = String.Empty; 
     //Get Mail Text Path 
     var path = HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate); 

     //mailBody = System.IO.File.ReadAllText(HostingEnvironment.MapPath("/Content/MailText/" + mailTemplate)); 
     using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (var sr = new StreamReader(fs)) { 
      mailBody = await sr.ReadToEndAsync(); 
     } 

     return mailBody; 
    } 


    private string BuildVerifyEmailBodyForMerchant(string mailBody, Merchant merchant) { 
     //Replace Custom Variables for Email Body 
     var url = System.Web.HttpContext.Current.Request.Url; 
     var urlLink = url.OriginalString.Replace(url.PathAndQuery, ""); 
     merchant.ProviderUserKey = Guid.NewGuid().ToString(); 
     urlLink = String.Concat(urlLink, "/"); 
     var verifyUrl = urlLink + "business/verify/" + merchant.ProviderUserKey.ToString(); 

     //replace variables 
     mailBody = mailBody.Replace("~userLastName~", merchant.Name); 
     mailBody = mailBody.Replace("~name~", String.Format("{0} {1}", merchant.FirstName, merchant.LastName)); 
     mailBody = mailBody.Replace("~companyName~", merchant.Name); 
     mailBody = mailBody.Replace("~dateOfRegistration~", merchant.DateOfRegistration.Value.ToShortDateString()); 
     mailBody = mailBody.Replace("~verifyUrl~", verifyUrl); 
     mailBody = mailBody.Replace("~email~", merchant.Email); 

     return mailBody; 
    } 

    private MailMessage BuildEmailMessage(string body, string subject, Merchant merchant) { 
     var msg = new MailMessage(); 

     msg.From = new MailAddress("[email protected]"); 
     msg.To.Add(merchant.Email.ToString()); 
     msg.Subject = subject; 
     msg.Body = body; 

     return msg; 
    } 

    public async Task SendEmailAsync() { 
     var emailTemplate = await GetEmailTemplateAsync(mailTemplate); 

     var emailBody = BuildVerifyEmailBodyForMerchant(emailTemplate, merchant); 

     var emailToSend = BuildEmailMessage(emailBody, subject, merchant); 

     using (var client = new SmtpClient()) { 
      await client.SendMailAsync(emailToSend); 
     } 
    } 
}