首页 > 解决方案 > 同一服务上的服务结构多个 WCF 终结点

问题描述

我正在尝试为服务创建 2 个端点:net.tcp 和 http。两个端点将具有相同的端点名称。如何在服务结构中做到这一点?

在 SF 中不运行时,很容易在 App config 中定义它,这样:

<service behaviorConfiguration="DefaultBehavior" name="ContractImplementation">
        <endpoint address="net.tcp://localhost:6000/ContractName" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="ContractName" />
        <endpoint address="http://localhost:6001/ContractName" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="ContractName" />
</service>

在 SF 中运行时,我通过创建 WcfCommunictionListener 对象来创建侦听器。我无法使用不同的绑定创建另一个,因为它抱怨端点名称已在使用中。

标签: wcfazure-service-fabric

解决方案


如此处的文档中所述:

为服务创建多个侦听器时,必须为每个侦听器指定一个唯一名称。

端点名称必须具有不同的名称,您可以在创建侦听器的逻辑中处理加载,您应该为每个端点创建一个侦听器并传递每个端点的名称;

像这样的东西:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new[]
    {
        new ServiceReplicaListener(context =>
          new WcfCommunicationListener<ICalculator>(
              wcfServiceObject:this,
              serviceContext:context,
              endpointResourceName: "WcfServiceEndpoint1",
              listenerBinding: WcfUtility.CreateTcpListenerBinding()
          )
        ),
        new ServiceReplicaListener(context =>
          new WcfCommunicationListener<ICalculator>(
              wcfServiceObject:this,
              serviceContext:context,
              endpointResourceName: "WcfServiceEndpoint2",
              listenerBinding: WcfUtility.CreateTcpListenerBinding()
          )
       )
   };
}

有关如何使用的更多信息,WcfCommunicationListener请查看此处


推荐阅读