Autofac WcfIntegration - 通过 net.tcp 进行通信时,无法激活 WCF 客户端服务

本文关键字:激活 WCF 服务 客户端 通信 通过 WcfIntegration net tcp Autofac | 更新日期: 2023-09-27 18:31:48

我有一个在IIS 7下托管的WCF客户端服务,并使用Autofac的WCF集成。此服务由另一个 WCF 服务使用基本 Http 绑定调用。自从大约 3 个月前开始使用该服务以来,一切运行良好

但是,当我尝试通过net.tcp调用此服务时,我能够执行此操作并在一段时间(通常约为8小时)内接收回调,之后我不断收到此错误:

无法激活请求的服务"net.tcp://ecomsvc.webhost.com:12345/EcomSvc.svc"。

托管服务器的异常是:

异常:

System.ServiceModel.ServiceActivation异常:由于编译过程中出现异常,无法激活服务"/EcomSvc.svc"。 异常消息为:必须先设置 AutofacServiceHost.Container 静态属性,然后才能实例化服务。---> System.InvalidOperationException:必须先设置 AutofacServiceHost.Container 静态属性,然后才能实例化服务。

服务的标记:

<%@ ServiceHost Service="EcomService.Contract.IEcomSvc, EcomService.Contract" Factory="Autofac.Integration.Wcf.AutofacHostFactory, Autofac.Integration.Wcf" %>

汽车注册:

private static void SetupDependencyContainer()
    {
        var builder = new ContainerBuilder();
        // Register service implementations.
        builder.RegisterType<EcomSvc>().As<IEcomSvc>();
        // Set the dependency resolver.
        var container = builder.Build();
        AutofacHostFactory.Container = container;
    }

从上述 Autofac 注册调用客户端的 WCF 服务:

private static void SetupDiContainer()
    {
        var builder = new ContainerBuilder();
        // Register service implementations
        builder.RegisterType<HandlerSvc>().As<IHandlerSvc>();
    builder.RegisterType<HandlerService().InstancePerLifetimeScope();
        ConfigureServices(builder);
        //register other dependencies
        builder.RegisterType<ProxyCache>().As<IProxyCache>().InstancePerLifetimeScope();
        // Set the dependency resolver.
        var container = builder.Build();
        AutofacHostFactory.Container = container;
    }
    private static void ConfigureServices(ContainerBuilder builder)
    {
        RegisterService<IEcomSvc>(builder, "EcomServiceTCP"); 
    }
    public static void RegisterService<T>(ContainerBuilder builder, string endpoint)
    {
        builder.Register(c => new ChannelFactory<T>(endpoint))
            .SingleInstance();
        builder.Register(c => c.Resolve<ChannelFactory<T>>().CreateChannel())
            .As<T>().UseWcfSafeRelease();
    }

标记:

<%@ ServiceHost
Service="HandlerService.IHandlerSvc, HandlerService"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>

Autofac WcfIntegration - 通过 net.tcp 进行通信时,无法激活 WCF 客户端服务

发生这种情况可能是因为您在 WCF 服务的Global.asaxApplication_Start()方法中执行 Autofac 注册。

Global.asax是仅限HTTP的。要与绑定无关(例如 TCP),您需要 WCF 服务的另一个起点。

一个选项是AppInitialize方法。在 WCF 服务的根目录中创建一个 App_Code 文件夹,并添加一个类(名称不重要)并添加具有此签名public static void AppInitialize()的方法。

此方法中的代码将在服务启动时执行,而不考虑用于触发服务的绑定。您可以在此处进行Autofac注册。

有关AppInitialize的更多信息,请点击此处。