【问题标题】:Using Postal with QueueBackgroundWorkItem - The request lifetime scope cannot be created > because the HttpContext is not available将 Postal 与 QueueBackgroundWorkItem 一起使用 - 无法创建请求生命周期范围 > 因为 HttpContext 不可用
【发布时间】:2016-03-17 13:04:19
【问题描述】:

我正在使用 Postal 发送电子邮件。 我的应用程序是一个 ASP.net MVC 应用程序。我使用 Autofac(MVC5 集成)

我已经这样设置邮政:

        dynamic email = new Email("TemplateName");
        email.To = "test@email.com";
        email.From = "sendertest@email.com";

        email.TemplateValue = "This is a value";

        var service = new EmailService();

        HostingEnvironment.QueueBackgroundWorkItem(ct =>
        {
            service.Send(email);
        });

这会失败并出现以下错误:

“System.InvalidOperationException”类型的异常发生在 Autofac.Integration.Mvc.dll 但未在用户代码中处理

附加信息:无法创建请求生命周期范围 因为 HttpContext 不可用。

   at Autofac.Integration.Mvc.RequestLifetimeScopeProvider.GetLifetimeScope(Action`1 configurationAction)  
   at Autofac.Integration.Mvc.AutofacDependencyResolver.get_RequestLifetimeScope()  
   at Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(Type serviceType)  
   at System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create(ControllerContext controllerContext, Type type)  
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)  
   at Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder)  
   at Postal.EmailViewRenderer.Render(Email email, String viewName)  
   at Postal.EmailService.CreateMailMessage(Email email)  
   at Postal.EmailService.Send(Email email)  
   at CallSite.Target(Closure , CallSite , EmailService , Object )  
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)  
   at EmailSender.<>c__DisplayClass3_0.<Handle>b__0(CancellationToken ct) in .....EmailSender.cs:line 42  
   at System.Web.Hosting.HostingEnvironment.<>c__DisplayClass91_0.<QueueBackgroundWorkItem>b__0(CancellationToken ct)  
   at System.Web.Hosting.BackgroundWorkScheduler.<RunWorkItemImpl>d__7.MoveNext()  

如果我将service.Send(email);QueueBackgroundWorkItem 中取出,它会起作用。

我知道这是因为 HttpContext.Current 不可用 - 但有没有办法可以在后台线程上使用 Postal 发送电子邮件?

【问题讨论】:

    标签: c# autofac postal


    【解决方案1】:

    邮政能够只创建一个MailMessage 对象,而不发送它。见http://aboutcode.net/postal/create-mail-message.html

    因此您可以在 MVC 控制器操作中执行此操作,同时 HttpContext 仍然存在。

    然后,使用您自己的SmtpClient 实例在后台线程中发送MailMessage

    【讨论】:

    • 您好,我也面临同样的问题,您能否就如何实施此解决方案给我更多指导。使用自己的 smtpClient 实例创建电子邮件后如何发送电子邮件
    【解决方案2】:

    您是否尝试过创建自定义视图引擎?

    正如here 建议的那样,可以在 ASP.NET 请求范围之外使用 postal(我知道您使用的是 MVC 5,但对我来说情况类似)。

    如果您仍然收到错误,可能是 Autofac 注册的问题:您是否在请求范围内注册了某些内容,例如 .InstancePerRequest(); ?在这种情况下,Autofac 将无法解析管道之外的组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多