两个服务器监听相同的地址

时间:2011-02-22 14:21:57

标签: c# named-pipes

我有一个可能正在运行多个实例的应用程序。我有一个同时在所有实例上执行的任务。 我想安排一个操作系统任务来运行一个通过命名管道发送消息的小应用程序,我希望我的所有实例都在该管道上进行监听并完成他们的工作。 当我尝试运行第二次时,我尝试了WCF命名管道并得到了AddressAlreadyInUseException。

可行吗?是否有意义?我的目标是正确的解决方案吗? (并非我不需要向申请人发送回复)

2 个答案:

答案 0 :(得分:2)

典型的方法是这样的:

  • 单个“负载均衡器”进程具有众所周知的地址并继续收听。
  • “工人”流程启动并联系“负载均衡器”流程;这在它们之间建立了一条管道。
  • “负载均衡器”然后在“工人”和外部世界之间路由请求和响应,通常每次都选择最不忙的“工人”。

'工人'不需要听管道或插座;您必须以不同方式配置它们,并将此配置传递给“负载均衡器”。通过监听“负载均衡器”,每个“工作人员”可以配置相同,只需要知道如何联系“负载均衡器”。

答案 1 :(得分:0)

Windows管道(如带有油,水或其他物品的真实管道)只有两端,一端是服务器,另一端是单个客户端。

单个管道上不能有多个客户端“侦听”,并且单个接收器将接收从管道发送的每个消息。

您可以让多个服务器都在同一管道名称上侦听管道连接,但管道名称只是一个集合点,而不是共享管道实例。连接到命名管道的每个客户端将通过单个管道实例连接到单个服务器(客户端无法选择)。没有可靠的方法来枚举所有侦听服务器。 (如果你想使用WCF,the way the named pipe binding creates and publishes the actual pipe name意味着,正如你所发现的,一次只有一个服务进程可以监听特定的服务URL)。

两种可能的方法:

  1. Windows Mailslots以您需要的方式支持广播。您的工作进程将使用相同的名称创建邮件槽,并监视它到达的邮件。您的触发器应用程序将向邮件槽发送消息。缺点是没有.NET库类包装此功能,因此您需要通过P / Invoke直接使用Win32 API。
  2. 转换您的WCF服务并使用NetNamedPipeBinding提供的双工消息传递支持。您的工作进程将是由触发器应用程序公开的WCF服务的客户端(如果它始终在工作进程中运行)或者由作为代理的单独服务公开(在这种情况下,它将公开第二个服务,触发器应用程序将用于启动通知)。工作进程使用的WCF服务将具有Register和UnRegister操作,工作进程将使用这些操作来通知其启动和停止。它还有一个回调合约,触发器(或代理)应用程序将用于将任务消息发送给工作人员。
  3. 我建议第二种方法不那么脆弱(邮件通信完全是一种方式,因此更难以诊断错误的范围)。