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

时间:2016-01-25 11:02:57

标签: c# wcf tcp dependency-injection autofac

我在IIS 7下托管了 WCF客户端服务并使用Autofac的WCF集成。此服务由另一个WCF服务使用基本Http绑定调用。自服务开始使用以来,大约3个月前,所有东西都

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

  

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

来自托管服务器的例外是:

  

异常:System.ServiceModel.ServiceActivationException:由于编译期间发生异常,无法激活服务'/EcomSvc.svc'。异常消息是:必须先设置AutofacServiceHost.Container静态属性才能实例化服务.. ---> System.InvalidOperationException:必须先设置AutofacServiceHost.Container静态属性,然后才能实例化服务。

服务的标记:

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

Autofac注册:

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" %>

1 个答案:

答案 0 :(得分:2)

这可能是因为您在WCF服务的Application_Start()的{​​{1}}方法中进行了Autofac注册。

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

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

无论用于触发服务的绑定如何,此方法中的代码都将在服务启动时执行。您可以在此处进行Autofac注册。

可以找到有关public static void AppInitialize()的更多信息here