Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 为MvcMailer创建新的HttpContext,以便我可以使用async/await_C#_.net_Asp.net Mvc_Async Await_Mvcmailer - Fatal编程技术网

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

C# 为MvcMailer创建新的HttpContext,以便我可以使用async/await,c#,.net,asp.net-mvc,async-await,mvcmailer,C#,.net,Asp.net Mvc,Async Await,Mvcmailer,我正在使用MVCMailer,它依赖于HttpContext来发送邮件 在某些情况下,我从WebJob发送邮件,或者在调用ConfigureAwait(false)的流中使用的异步任务中发送邮件,因此我在点击MVCMailer代码之前丢失了上下文 我的选择似乎是: 永远不要使用ConfigureAwait(false)(我的许多服务都会在某个时候使用邮件,因此一个实例将删除我需要的上下文) 如果需要,可以新建一个HttpContext,这样我就可以在没有HttpContext的情况下发送邮件

我正在使用MVCMailer,它依赖于HttpContext来发送邮件

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

我的选择似乎是:

  • 永远不要使用
    ConfigureAwait(false)
    (我的许多服务都会在某个时候使用邮件,因此一个实例将删除我需要的上下文)
  • 如果需要,可以新建一个HttpContext,这样我就可以在没有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";
        });
    }
}

如果MvcMailer必须有一个HttpContext引用,我将对其进行抽象。创建一个公共邮件接口或基类(看起来您现在在MailerBase中有这样的接口或基类),如果您有:

public class WebJobMailer : MailerBase { .. }

然后您可以让webjob使用此实现,但是您的MVC应用程序使用MvcMailer实现。。。WebJob mailer可以返回System.Net.Mail,或者使用其他工具。

如果MvcMailer必须有一个HttpContext引用,我会将其抽象出来。创建一个公共邮件接口或基类(看起来您现在在MailerBase中有这样的接口或基类),如果您有:

public class WebJobMailer : MailerBase { .. }

然后您可以让webjob使用此实现,但是您的MVC应用程序使用MvcMailer实现。。。WebJob mailer可能会返回System.Net.Mail,或者使用其他工具。

如果您有代码在删除请求的上下文,而您仍然希望处于该请求的上下文中,那么这是一个错误,不仅是为了这一类的目的,而且一般来说,因为它需要修复。只有当代码确实确定该方法及其调用的任何内容在概念上与请求无关时,才应该删除当前上下文。@Servy这就是我列出第一个选项的原因,一些我想避免的事情。试图避免修复那些最终会给应用程序的各个方面(不仅仅是这一部分)带来各种问题的bug不会有好的结果。如果您的程序在必要的上下文之外不适当地运行代码,您应该对此进行修复。@Servy“避免修复bug”在这种情况下意味着永远不要放弃上下文。我正在寻找一种方法来消除对特定上下文的依赖,因为不需要特定上下文。“各种各样的问题”-您假设我的应用程序的其他部分依赖于上下文。在他们这样做的情况下,我不会放过上下文。我认为你做的假设太多了,但需要背景。此操作在概念上显然与特定请求相关。在该请求的上下文之外执行它是错误的。如果操作实际上根本没有与请求交互,那么可以在请求上下文之外运行该操作。如果您有代码在删除请求上下文的同时仍希望处于该请求上下文中,那么这是一个bug,不仅仅是为了这一类的目的,一般来说,因为它需要修复。只有当代码确实确定该方法及其调用的任何内容在概念上与请求无关时,才应该删除当前上下文。@Servy这就是我列出第一个选项的原因,一些我想避免的事情。试图避免修复那些最终会给应用程序的各个方面(不仅仅是这一部分)带来各种问题的bug不会有好的结果。如果您的程序在必要的上下文之外不适当地运行代码,您应该对此进行修复。@Servy“避免修复bug”在这种情况下意味着永远不要放弃上下文。我正在寻找一种方法来消除对特定上下文的依赖,因为不需要特定上下文。“各种各样的问题”-您假设我的应用程序的其他部分依赖于上下文。在他们这样做的情况下,我不会放过上下文。我认为你做的假设太多了,但需要背景。此操作在概念上显然与特定请求相关。在该请求的上下文之外执行它是错误的。如果操作实际上根本没有与请求交互,然后在请求上下文之外运行操作就可以了。但是我不能使用MVCMailer-这就是我正在尝试做的。我不建议尝试制作一个假的HttpContext来让MVCMailer工作-这是HttpContext服务有时会遇到的问题。。。您永远不知道它调用了哪些API方法,这些方法通常高度依赖于web环境。。。。除非web作业调用IIS服务器上发送消息的网页(显然,许多移动部件可能会有问题)。但是我不能使用MVCMailer-这就是我正在尝试做的。我不建议尝试制作一个假的HttpContext来让MVCMailer工作-这是基于HttpContext的服务有时存在的问题。。。您永远不知道它调用了哪些API方法,这些方法通常高度依赖于web环境。。。。除非web作业调用IIS服务器上发送消息的网页(显然,许多移动部件可能会有问题)。