[英]Multiple instances of a self hosted WCF service
我们有一个从C#中的控制台应用程序运行的“工作者”服务,为了进行开发,我们始终在运行该服务的单个实例,该实例会提取数据块并执行一些计算,这些数据块是由另一个服务提供的(跟踪剩余多少数据等)
现在,在质量检查中,我们希望同时(在同一台机器上)运行“工作者”服务的多个实例。但是,一旦启动第二个实例,我们将获得异常:
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,以便至少使端口保持不变?
或如果有不同的方式来运行同一服务的多个实例?
如果您想拥有多个服务实例,而仅拥有一个服务主机就足够了-只需用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
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:启用端口共享
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
您可以定义自己的specific behavior
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.