为MvcMailer创建新的HttpContext,以便我可以使用async / await

时间:2016-11-01 17:37:34

标签: c# .net asp.net-mvc async-await mvcmailer

我使用MVCMailer依赖于HttpContext来发送邮件。

在某些情况下,我从WebJob发送邮件,或者在调用ConfigureAwait(false)的流中使用异步任务,因此在我点击MVCMailer代码之前我丢失了上下文。

我的选择似乎是:

  • 永远不要使用ConfigureAwait(false)(我的许多服务在某些时候使用Mailing,因此其中一个实例将删除我需要的上下文)
  • 如果需要,可以新建一个HttpContext,这样我就可以邮寄,尽管没有一个
  • 不使用MvcMailer并使用第三方

我正在寻找快速简便的解决方案 - 如果需要,可以新建一个HttpContext。这可能吗?

这是我现在使用的代码,它依赖于HttpContext:

 public class UserMailer : MailerBase {
    public UserMailer() {
        MasterName = "_Layout";
    }

    public virtual MvcMailMessage Message(MailMessage message, string unsubscribeLink = null) {
        ViewBag.Body = message.Body;
        ViewBag.Subject = message.Subject;
        ViewBag.UnsubscribeLink = unsubscribeLink;
        return Populate(x => {
            x.ViewName = "Message";
        });
    }
}

1 个答案:

答案 0 :(得分:0)

如果MvcMailer必须有一个HttpContext引用,我会抽象它。创建一个公共邮件接口或基类(看起来你现在已经使用MailerBase),如果你有:

public class WebJobMailer : MailerBase { .. }

然后你可以让webjob使用这个实现,但你的MVC应用程序是MvcMailer实现......然后WebJob邮件可以回退到System.Net.Mail,或者使用别的东西。