Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送电子邮件mvc 5时奇怪的异步或非异步控制器操作行为_C#_Email_Asp.net Mvc 5_Async Await - Fatal编程技术网

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