У меня есть действие асинхронного в контроллере, который похож на этомстранного поведение асинхронного или не асинхронное действие контроллера при отправке по электронной почте 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);
}
}
Есть ли [это] (http://stackoverflow.com/a/19976673/11683) что-то изменить? – GSerg
Ваша фразировка немного запутанна (для меня в любом случае), поэтому просто чтобы быть понятным - вы говорите, если вы закомментируете строку 'GetEmailTemplate();', почта отправляет, а если нет, это не так? – sellotape
@sellotape - либо строка, либо код в этом методе. –