Autofac错误-从请求实例的范围中看不到标记匹配“ AutofacWebRequest”的范围

lex*_*x87 3 asp.net-mvc wcf dependency-injection autofac autofactory

在我的一个Web应用程序中,我有一个使用Autofac的Web服务,其svc文件如下:

<%@ ServiceHost Language="C#" Debug="true" 
Service="MyApp.WebServices.Contracts.Interfaces.IMyWebService, MyApp.WebServices.Contracts" 
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>
Run Code Online (Sandbox Code Playgroud)

我为我的Web服务应用程序注册依赖项,如下所示:

public class IocConfig
{        
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();            

        //web services
        builder.RegisterType<MyWebService>().As<IMyWebService>().InstancePerLifetimeScope();

        var container = builder.Build();

        AutofacHostFactory.Container = container;            
    }
}
Run Code Online (Sandbox Code Playgroud)

从另一个Web应用程序,我也想使用Autofac连接到那些服务,所以我注册了类似的依赖项:

public class IocConfig
{
    //Ioc dependencies for frontend application
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);

        builder.RegisterModule<AutofacWebTypesModule>();

        builder
            .Register(c => new ChannelFactory<ISomeWebService>(
                new BasicHttpBinding(),
                new EndpointAddress("http://localhost/MyApp.WebServices/MyWebService.svc")))
            .InstancePerLifetimeScope();

        //register service proxies
        builder.Register(c => c.Resolve<ChannelFactory<IMyWebService>>().CreateChannel())
            .As<IMyWebService>()
            .UseWcfSafeRelease();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}
Run Code Online (Sandbox Code Playgroud)

在其中一个控制器中,我执行以下操作:

public SomeController(IMyWebService myServiceProxy) 
    {
        _myServiceProxy = myServiceProxy;

        var response =_myServiceProxy.CallSomeMethod(new Request()
        {
            EmailAddress = "test@test.com"
        });
    }
Run Code Online (Sandbox Code Playgroud)

IMyWebService类型的myServiceProxy正在解析,我看到它是一个透明代理,但是当我调用“ CallSomeMethod”时,出现错误:

从请求实例的范围中看不到带有匹配“ AutofacWebRequest”标签的范围。通常,这表明SingleInstance()组件正在请求注册为HTTP请求的组件(或类似方案)。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身请求依赖项。

我在这里做错了什么?谢谢!

Tra*_*lig 6

根据文档,WCF不支持每个请求的生存期范围。如果您的服务实现采用依赖关系,则无法根据请求注册它们。

有一个常见问题解答,告诉您如何解决此问题以及可以使用的替代方法。

  • 将我的依赖项生存期从InstancePerRequest更改为InstancePerLifetimeScope,现在可以使用了。谢谢! (2认同)