我有一个简单的WCF服务,用于在我们的应用程序中进行跨应用程序域通信。
该服务通过NamedPipeBinding公开,目前使用的是硬编码名称:
var address =“net.pipe:// localhost / app / log”;
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
binding.ReceiveTimeout = TimeSpan.MaxValue;
binding.
logServiceHost = new ServiceHost(typeof(LogService));
logServiceHost.AddServiceEndpoint(typeof(ILogProvider), binding, address);
logServiceHost.Open();
问题是此名称是硬编码的,因此我们的应用程序的另一个实例无法分配新的命名管道(因为该名称已被占用)。
是否可以检查是否已经使用了名称,如果是,则分配不同的名称?
还是有其他更简单的策略来处理这种情况吗?
答案 0 :(得分: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行为。