自托管WCF服务的多个实例

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

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

TransportManager无法使用NetTcpPortSharing服务侦听提供的URI:URI已在服务中注册。

我们正在使用netTcpBinding并且端点地址被硬编码到app.config中并保持不变,因此我假设我们收到此错误。

            

申请代码:

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

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

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

如果您希望拥有多个服务实例,而不是拥有单个服务主机 – 只需使用ServiceBehaviorAttribute修饰您的WorkerService

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

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

但是,如果您希望拥有多个服务主机,则无法拥有两个将在完全相同的URL上托管相同服务的服务主机。

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

          

使用此配置,您将拥有两个服务端点

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

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

Murtaza你是对的,你仍然需要多个实例,问题是如何给出不同的端口

备用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:启用端口共享

             

您可以定义您的specific behavior

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