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