2012-02-19 18 views
2

我有一个简单的WCF服务,用于在我们的应用中进行跨应用程序域通信。测试命名管道绑定是否可用或已在使用中

服务经由NamedPipeBinding暴露,目前使用的是硬编码名称:

VAR地址= “net.pipe://本地主机/应用程序/登录”;

 NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None); 
     binding.ReceiveTimeout = TimeSpan.MaxValue; 
     binding. 
     logServiceHost = new ServiceHost(typeof(LogService)); 
     logServiceHost.AddServiceEndpoint(typeof(ILogProvider), binding, address); 

     logServiceHost.Open(); 

的问题是,这个名字是硬编码的,因此我们的应用程序的另一个实例,不能分配一个新的命名管道(因为该名称已采取了)。

是否有可能检查名称是否已被占用,如果是,则分配一个不同的名称?

或者还有其他更简单的策略来处理这种情况?

回答

3

你基本上试图做'多实例意识'服务。典型的做法是让每个服务实例宣布它存在。要做到这一点,最好的方法是使用添加公告端点:

var discoveryBehavior = new ServiceDiscoveryBehavior(); 
discoveryBehavior.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint()); 
logServiceHost.Description.Behaviors.Add(discoveryBehavior); 
logServiceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint()); 
logServiceHost.Open(); 

以后可以发现网络中现有服务的每个实例,并采取必要的措施,以防止端点URI的冲突,如果需要的话。

您可以通过链接了解关于WCF Auto Discovery行为的更多信息。

相关问题