c# - 自托管 WCF 服务的多个实例

标签 c# .net wcf multiple-instances self-hosting

我们有一个从控制台应用程序在 c# 中运行的“ worker ”服务,为了开发我们总是运行该服务的单个实例,它获取数据 block 并执行一些计算,这些数据 block 由另一个服务提供(它跟踪剩余的数据量等)

现在在 QA 中,我们希望同时运行“worker”服务的多个实例(在同一台机器上)。但是,一旦启动第二个实例,我们就会遇到异常:

The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: the URI is already registered with the service.

我们正在使用 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,以便至少端口保持不变?

或者是否有不同的方式来运行同一服务的多个实例?

最佳答案

如果您想拥有多个服务实例而不是拥有单个服务主机就足够了 - 只需使用 ServiceBehaviorAttribute 装饰您的 WorkerService

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

这将确保对服务的每次调用都将首先创建服务的新实例。可以找到创建服务类的其他方法 here

但是,如果您希望拥有多个服务主机,那么不可能有两个服务主机在完全相同的 url 上托管相同的服务。

另一种情况是,如果您想让一个服务主机在具有相同基地址和自定义 uri 的多个端点上托管相同的服务。在这种情况下,您可以使用重载的 ServiceHost 构造函数或研究方法 AddBaseAddressAddServiceEndpoint。或者,如果您想从配置文件中执行此操作,那么这里是对您的代码稍作修改的简单示例

<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://localhost:8001/WorkerAssignment

net.tcp://localhost:8001/QAWorkerAssignment

关于c# - 自托管 WCF 服务的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412111/

相关文章:

c# - 添加和删​​除匿名事件处理程序

时间:2019-03-17 标签:c#FIREBASEdeserialize

c# - 为什么 Guid 构造函数的源代码包含 "this = Guid.Empty"行?

.net - 一旦用户对 datagridview 进行排序,我如何取回原始行索引?

c# - Windows服务之间如何通信

c# - 如何在没有序列化工具的情况下将对象转换为 XML

c# - 逃避角色的最佳方式

c# - 如何处理纯粹与 View 相关的命令?

WCF监听服务总线

c# - ASP.Net Web API 与 WCF,我应该在我的项目中选择哪一个