我有两个不相关的进程,它们使用.NET程序集作为插件。但是,任何一个进程都可以随时启动/停止。我不能依赖特定的进程作为服务器。实际上,可能有多个副本运行其中一个进程,但只有一个副本运行。
我最初实施了一个基于this article的解决方案。但是,这需要实现服务器的服务器在客户端之前运行。
当客户端首先运行时,向服务器实施某种通知的最佳方式是什么?
答案 0 :(得分:1)
使用共享内存更加困难,因为您必须管理共享内存缓冲区的大小(或者只是预先分配足够的内存)。您还必须手动管理放在那里的数据结构。一旦你经过测试和工作,它就会更容易使用和测试,因为它很简单。
如果您使用远程路由,则可以使用IpcChannel而不是TCP或HTTP通道进行使用命名管道的单个系统通信。 http://msdn.microsoft.com/en-us/library/4b3scst2.aspx。此解决方案的问题在于,您需要提供一个注册表类型解决方案(在共享内存或其他持久性存储中),进程可以注册其端点。这样,当您查找它们时,您可以找到一种方法来查询系统上运行的所有端点,并且您可以找到您要查找的内容。使用Remoting的好处是序列化和方法调用都非常简单。此外,如果您决定转移到网络上的多台计算机,您只需翻转交换机即可使用网络通道。缺点是除非你明确地将“远程”呼叫与“本地”呼叫分开,否则远程处理会令人沮丧。
我对WCF知之甚少,但这也值得研究。蜘蛛意识说它可能有一个更优雅的解决方案来解决这个问题......也许吧。
或者,您可以创建一个“服务器”进程,该进程与所有其他进程分开并启动(使用系统Mutex以确保不启动多个进程)作为中间人和注册所有其他流程的中心。
要查看事件的Publish-Subscribe模型(Pub / Sub)还有一件事。当您拥有在事件源可用之前启动的侦听器,但您不想等待注册该事件时,此技术会有所帮助。 “服务器”进程将处理事件注册表以链接发布者和订阅者。
答案 1 :(得分:0)
为什么不在两边托管服务器和客户端,谁先出现的服务器?如果服务器退出,仍处于活动状态的客户端会切换角色。
答案 2 :(得分:0)
有很多方法可以处理IPC(.net与否),并且通过TCP / HTTP隧道是一种方式......但是可能是一个非常糟糕的选择(取决于环境和环境)。
共享内存和命名管道有两种方式(是的,它们可以在.Net中完成),这可能是更好的解决方案。 .Net Framework中还有IPC类......但由于一些AppDomain问题,我个人不喜欢它们......
答案 3 :(得分:0)
我同意加罗的意见。
使用pub / sub服务将是一个很好的解决方案。这显然意味着该服务需要在其他两个服务之前启动并运行。
如果您想跳过pub / sub,您可以在具有不同端点的两个应用程序中实现该服务。当任一应用程序启动时,它会尝试通过IPC代理访问其他已知对象。如果代理失败,则另一个对象未启动。
-Scott
答案 4 :(得分:0)
我花了两天的时间来琢磨IPC的所有选项,同时寻找一种可靠,简单,快速的全双工IPC方式。我在Codeplex.com上找到的IPCLibrary到目前为止完全不是我尝试过的所有选项。所有只有7行代码。 :D如果有人偶然发现想要找到一个全双工的IPC,请节省大量的时间并试试这个库。获取源代码,编译data.dll并按照给出的示例进行操作。
HTH, CIRC