自承载WCF服务的多个实例(Multiple instances of a self hosted

2019-06-28 09:06发布

我们有一个“工人”的服务从C#控制台应用程序中运行,发展我们总是运行此服务,获取数据块,并进行一些计算的单个实例,这些数据块被另一个服务提供(其中跟踪是多少留下的数据等)

现在,在QA我们要同时运行的“工人”服务的多个实例(在同一台机器上)。但是我们只要二审启动得到一个异常:

该TransportManager失败使用NetTcpPortSharing服务所提供的URI听:URI是已经注册该服务。

我们正在使用NetTcpBinding的和端点地址硬编码到的app.config和保持不变,因为我认为我们得到了这个错误。

<services>
    <service behaviorConfiguration="CoreBehavior" name="WorkerService">
        <endpoint address="net.tcp://localhost:8001/WorkerAssignment" binding="netTcpBinding" contract="IWorkerService" bindingConfiguration="CoreTcpBinding"/>
    </service>
</services>
<bindings>
    <netTcpBinding>
        <binding name="CoreTcpBinding" portSharingEnabled="true">
            <security mode="None"/>
        </binding>
    </netTcpBinding>
</bindings> 

施药代码:

var host = new ServiceHost(typeof(WorkerService));
host.Open();

我们如何为每个实例提供不同的URI,这样至少应端口将保持不变?

或者如果有不同的方式来运行相同服务的多个实例?

Answer 1:

如果你想有服务的多个实例比它足有单服务主机-只是装点你ServiceBehaviorAttribute WorkerService

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Percall)] 
public class WorkerService : IWorkerService 
{
  //...service data
}

这将确保该服务每次通话将首先创建服务的新实例。 创建服务类的其他方式,可以发现这里

但如果你想有多个服务主机比它不可能有两个服务的业主将在完全相同的URL主机相同的服务。

如果你想有托管与相同的基地址和自定义的URI的多个端点相同服务的一个服务主机另一种情况是。 在这种情况下,你可以使用重载的ServiceHost构造函数或方法调查AddBaseAddress,AddServiceEndpoint。 或者,如果你想从配置文件做得比这里简单的例子与您的代码稍加修改

<service behaviorConfiguration="CoreBehavior" name="WorkerService">
    <endpoint address="WorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
    <endpoint address="QAWorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://localhost:8001/" />
    </baseAddresses>
  </host>
</service>

与此配置,你将有两个端点为您服务

的net.tcp://本地主机:8001 / WorkerAssignment

的net.tcp://本地主机:8001 / QAWorkerAssignment



Answer 2:

穆尔塔扎你是正确的,你还需要多个实例和问题是如何给不同的端口

备选1:对于服务的每个实例:调用ServiceHost.Open才能添加端点服务

ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))
WSHttpBinding binding = new WSHttpBinding();
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "http://localhost:8000/servicemodelsamples/service/basic");

在上面的代码中的地址部分可以具有不同的端口,用于服务的每个实例。

有关详情如下链接

备用2:启用端口共享

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>


Answer 3:

您可以定义specific behavior

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
                 ConcurrencyMode = ConcurrencyMode.Multiple)]


文章来源: Multiple instances of a self hosted WCF service