WCF替代方案用于进程/机器间通信

9
我正在开发一个C#应用程序,其中包含多个Windows服务,这些服务需要相互通信以传递数据。这些服务可能在同一台机器上,但也可能是远程的。我研究了使用WCF来实现这个目的,但似乎WCF太重了,并且有很多额外的配置,对我来说似乎是不必要的(这里需要.NET 3.5,我知道.NET 4简化了这个过程)。
所以我的问题是,除了已弃用的.NET Remoting之外,哪种替代方案是最好的,可以提供这种功能?

抱怨配置似乎有点小题大做。至于性能,NetTCP绑定在3.5中可用,所以我不确定你的担忧是什么。 - Kirk Woll
我更好奇是否有其他选择,如果有的话,它们可能是什么。在谷歌上搜索总是指向WCF。这是来自通常编写Java程序的人的意见,所以我习惯于RMI、EJB等。 - Andrew Landsverk
4
我得出了与你差不多的结论。我发现WCF的配置棘手且文档不完整,在一番摸索之后,我发现它非常缓慢,而且在释放内存方面有些困难。也许是我的设置有误,但它的性能并不如我所希望的那样高,而在众多的配置选项中,修复方法并不明显。最终,我写了一个自己的“轻量级”远程调用框架,希望有一天能获得开源的批准。它的实现绝非琐事。除非你正碰到这些问题,否则建议仍然使用WCF,直到它“被证明”有问题为止。 - spender
3个回答

16

我已经使用PInvoke接近8年来访问Windows RPC运行时。它非常快速并且作为传输方式非常可靠。当与像protobuf-csharp-port这样的快速序列化器结合使用时,生成的通信结果非常牢固和非常快速

因此,从基础开始构建需要三个部分:

  1. Google的协议缓冲区(protobuf-csharp-port)用于序列化。
  2. 我自己的CSharpTest.Net.RpcLibrary用于传输。
  3. 一些粘合代码,从protobuf-csharp-rpc组合它们。
这些都可以在NuGet中找到,分别对应以下包:Google.ProtocolBuffers, CSharpTest.Net.RpcLibrary, 和 Google.ProtocolBuffers.Rpc。下面是快速入门指南:
  1. 使用Google Protocol Buffer Language定义一组消息和服务。

  2. 定义完成后,运行ProtoGen.exe在C#中生成服务存根和消息。请确保添加“-service_generator_type=IRPCDISPATCH”以生成正确的服务代码。

  3. 现在您已经有了生成的源文件,请将它们添加到项目中,并引用上面列出的三个程序集。

  4. 最后,查看protobuf-csharp-rpc项目页面上的示例客户端/服务器代码。将“SearchService”替换为您的服务名称,然后就可以运行了。

  5. 可选地,更改RPC客户端/服务器的配置。示例显示LRPC的使用仅限于本地主机;但是DemoRpcLibrary.cs源文件也显示了TCP/IP和命名管道。

您可以随时给我发送电子邮件(我的用户名为roger),以获取更多信息或示例。
更新
我编写了一个快速启动指南:WCF替代跨进程/机器通信

1
@Andrew Landsverk,请参见:http://csharptest.net/1177/wcf-replacement-for-cross-processmachine-communication/ - csharptest.net
1
哈!你的帖子证实了我对WCF的所有怀疑,但我从未测量过。你的解决方案非常有趣...绝对值得超过+1的答案。 - spender
@csharptest.net 感谢您分享这个库,做得很棒。我正在努力弄清楚如何处理长时间运行的操作。Execute()调用是同步的,理论上我可以重构库以拆分调用/返回序列。是否有内置的“事件”或服务器->客户端调用的方法?我查阅了Shirley和Rosenberry的《Microsoft RPC编程指南》,但没有找到相关信息。 - Yuriy Gettya
@csharptest.net(无法编辑先前的评论)似乎RpcContext是需要深入研究的方向。是否有计划将其添加到库中? - Yuriy Gettya
可以进行异步 rpc 调用,但我还没有时间添加支持。我们倾向于使用长轮询来提供状态等信息。 - csharptest.net
显示剩余3条评论

2

你可能想了解一下ZeroMQ,它非常轻量级、高效,并且带有良好的C#绑定。由于我是在手机上输入这段话的,所以你现在需要自己在Google上搜索一下,抱歉。


我不会完全称ZeroMQ为轻量级。 - Erik Forbes
ZeroMQ非常好,只要您不关心响应并且不担心消息被丢弃。像所有队列一样,只能存储有限的积压量。ZeroMQ在保证传递和请求/响应配置方面的性能特别差。 - csharptest.net

0

文档在哪里? - Ersin Tarhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接