2016-03-17 4 views
1

Я использую почтовый адрес для отправки электронной почты. Мое приложение - приложение ASP.net MVC. Я использую Autofac (MVC5 интеграции)Использование Postal с QueueBackgroundWorkItem - область ожидания запроса не может быть создана>, потому что HttpContext недоступен

Я настроил Postal так:

 dynamic email = new Email("TemplateName"); 
     email.To = "[email protected]"; 
     email.From = "[email protected]"; 

     email.TemplateValue = "This is a value"; 

     var service = new EmailService(); 

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

Это не может со следующей ошибкой:

An exception of type 'System.InvalidOperationException' occurred in Autofac.Integration.Mvc.dll but was not handled in user code

Additional information: The request lifetime scope cannot be created because the HttpContext is not available.

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 на фоновом потоке?

ответ

2

Почтовый имеет возможность создать объект MailMessage, не отправляя его. См. http://aboutcode.net/postal/create-mail-message.html

Итак, вы можете сделать это в действии контроллера MVC, в то время как HttpContext все еще жив.

Затем отправьте MailMessage в фоновом режиме, используя ваш собственный экземпляр SmtpClient.

+0

Привет, Я столкнулся с этой проблемой, вы можете дать мне больше рекомендаций о том, как реализовать это решение. Как отправить электронное письмо после его создания с использованием собственного экземпляра smtpClient – Diin

0

Вы пытались создать собственный механизм просмотра?

Как предлагалось here, возможно использовать почтовый внешний вид области запроса ASP.NET (я знаю, что вы используете MVC 5, но для меня такая же ситуация).

Если вы все еще получаете ошибку, возможно, это проблема регистрации Autofac: вы зарегистрировали что-то в области запроса, например, .InstancePerRequest();? В этом случае Autofac не сможет разрешить эти компоненты за пределами конвейера.

 Смежные вопросы

  • Нет связанных вопросов^_^