C# 发送电子邮件mvc 5时奇怪的异步或非异步控制器操作行为
我在控制器中有一个异步操作,如下所示C# 发送电子邮件mvc 5时奇怪的异步或非异步控制器操作行为,c#,email,asp.net-mvc-5,async-await,C#,Email,Asp.net Mvc 5,Async Await,我在控制器中有一个异步操作,如下所示 public async Task<ActionResult> Register(MerchantRegistrationViewModel merchantRegistrationViewModel) { if (ModelState.IsValid) { //Some code //SendMail EmailManager em = new EmailManager("Mer
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");
}
}
我注意到的问题是包含此代码块的方法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("no-reply@mydomain.com");
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);
}
}
下面是一个重构的
EmailManager
,给出了OP中提供的示例。
对这些方法进行了重构,以更好地表达它们的依赖关系,并希望有助于隔离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("no-reply@mydomain.com");
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);
}
}
}
公共接口IEmailManager{
任务SendEmailAsync();
}
公共类EmailManager:IEmailManager{
私有字符串邮件模板;
私人商人;
私有字符串主题;
public EmailManager(字符串邮件模板、商户、字符串主题){
this.mailTemplate=mailTemplate;
this.merchant=商户;
this.subject=主语;
}
专用异步任务GetEmailTemplateAsync(字符串mailTemplate){
var mailBody=String.Empty;
//获取邮件文本路径
var path=HostingEnvironment.MapPath(“/Content/MailText/”+mailTemplate);
//mailBody=System.IO.File.ReadAllText(HostingEnvironment.MapPath(“/Content/MailText/”+mailTemplate));
使用(var fs=new FileStream(路径,FileMode.Open,FileAccess.Read,FileShare.Read))
使用(var sr=新的StreamReader(fs)){
mailBody=wait sr.ReadToEndAsync();
}
返回邮件体;
}
私有字符串BuildVerifyEmailBodyForMerchant(字符串邮箱,商户){
//替换电子邮件正文的自定义变量
var url=System.Web.HttpContext.Current.Request.url;
var urlink=url.OriginalString.Replace(url.PathAndQuery,“”);
merchant.ProviderUserKey=Guid.NewGuid().ToString();
urlink=String.Concat(urlink,“/”);
var verifyUrl=urlink+“business/verify/”+merchant.ProviderUserKey.ToString();
//替换变量
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);
返回邮件体;
}
private MailMessage BuildEmailMessage(字符串正文、字符串主题、商户){
var msg=new MailMessage();
msg.From=新邮件地址(“否-reply@mydomain.com");
msg.To.Add(merchant.Email.ToString());
msg.Subject=主语;
msg.Body=Body;
返回味精;
}
公共异步任务SendEmailAsync(){
var emailTemplate=await GetEmailTemplateAsync(mailTemplate);
var emailBody=BuildVerifyEmailBodyForMerchant(emailTemplate,商户);
var emailToSend=BuildEmailMessage(emailBody、主题、商户);
使用(var client=new SmtpClient()){
等待client.SendMailAsync(emailToSend);
}
}
}
有什么变化吗?你的措辞有点混乱(无论如何对我来说),所以我要说清楚-你是说如果你注释掉GetEmailTemplate()代码>行,邮件发送,如果不发送,则不发送?@sellotape该行或该方法中的代码。@GSerg正在尝试建议的链接。@GSerg未更改任何内容:(
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("no-reply@mydomain.com");
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);
}
}
}