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

我有ASP.NETMVC应用程序,其中我用InstancePerHttpRequest瞄准镜。

builder.RegisterType<Adapter>().As<IAdapter>().InstancePerHttpRequest();

然后,我有一段异步代码,在其中解析Adapter组件。

以下代码已简化

Task<HttpResponseMessage> t = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>

      // IHandleCommand<T> takes an IAdapter as contructor argument
      var h = DependencyResolver.Current.GetServices<IHandleCommand<T>>();
);

上面的代码抛出了一个异常:The request lifetime scope cannot be created because the HttpContext is not available.

然后,我将解析代码调整为

 using (var c= AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope(x => x.RegisterType<DataAccessAdapter>().As<IDataAccessAdapter>).InstancePerLifetimeScope()))
 {
       var h = DependencyResolver.Current.GetServices<IHandleCommand<T>>();
 }

但例外情况保持不变。The request lifetime scope cannot be created because the HttpContext is not available.

 

解决方法:

Autofac试图从MVC依赖Resolver解析容器,如果您有异步操作,则httpContext将不可用,因此DependencyResolver也不可用。

其中一个选项可以使容器在静态变量或适当的实例中可用,并为此操作创建上下文范围。

public static IContainer Container

一旦安装了构建器,就复制容器。

public class ContainerConfig
{
    public static IContainer Container;
    public static void RegisterComponents()
    {
        var builder = new ContainerBuilder();
        builder.RegisterInstance(new Svc()).As<ISvc>();
        Container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(Container ));
    }
}    

然后,在解析时,使用静态容器配置来创建所需的实例。

using (var scope = ContainerConfig.Container.BeginLifetimeScope())
{
       result = ContainerConfig.Container.Resolve<T>();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值