为MvcMailer创建新的HttpContext,这样我就可以使用异步/等待

问题描述:

我使用MVCMailer,它依赖于HttpContext发送邮件。为MvcMailer创建新的HttpContext,这样我就可以使用异步/等待

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

我的选择似乎是:

  • 切勿使用ConfigureAwait(false)(所以我的很多服务使用邮件在某些时候,所以这一个实例将删除我需要的情况下)
  • 新建了一个的HttpContext如果需要的话,这样我可以邮寄尽管没有一个
  • 不使用MvcMailer和使用第三方

我正在寻找快速和简单的解决方案 - newing了一个HttpConte xt如果需要。这可能吗?

这是我现在使用的代码依赖于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"; 
     }); 
    } 
} 
+0

如果你有代码去除请求的上下文*当你仍然打算在请求的上下文中*那么这是一个错误,而不仅仅是为了这个类的目的,但总的来说,因为它需要被修复。只有在确定该方法及其调用的任何内容在概念上与请求无关时,该代码才应该删除当前上下文。 – Servy

+0

@Servy这就是为什么我列出了第一个选项,这是我想避免的。 – SB2055

+0

试图避免修复最终会导致各种应用程序问题的各种问题,而不仅仅是这部分,并不会很好地结束。如果你的程序不适当地在必要的上下文之外运行代码,那么你应该修复这个问题。 – Servy

如果MvcMailer都必须有一个HttpContext的参考,我想它抽象。创建一个通用的邮件接口或基类(看起来像你现在有MailerBase)如果您有:

public class WebJobMailer : MailerBase { .. } 

然后你就可以有webjob使用此实现,但你的MVC应用程序的执行MvcMailer ... WebJob邮件程序可以回退到System.Net.Mail,或者使用其他的东西。

+0

但是,我不能使用MVCMailer - 这正是我想要做的。 – SB2055

+1

我不会推荐尝试制作一个假的HttpContext来让MvcMailer工作 - 这就是有时候基于HttpContext的服务的问题......你永远不知道它调用哪些API方法,它们通常高度依赖于Web环境。 ..除非网络作业调用发送消息的IIS服务器上的网页(显然许多移动部件可能有问题)。 –