.NET中程序之间的通信

时间:2009-08-16 11:46:28

标签: c# .net ipc software-design

我想将程序的模块分开以便彼此通信。它们可能在同一台计算机上,但可能在不同的计算机上。

我正在考虑两种方法:

  1. 创建一个包含所有细节的类。将其发送到通信层。这个序列化它,发送它,另一个反序列化它回到类,而不是进一步处理它。
  2. 创建哈希表(键/值)。将所有数据放入其中。发送给通信层等等
  3. 所以它归结为散列表与类。

    如果我认为'松散耦合',我赞成哈希表。更新一个模块很容易,在hastable中包含新的额外参数,而不更新另一方。

    然后再次使用类我得到编译时类型检查,而不是运行时。

    有没有人先解决这个问题并对此提出建议?

    谢谢!

    编辑: 我已经给出了与我原来的问题最相关的答案,虽然它不是最受欢迎的答案

5 个答案:

答案 0 :(得分:4)

听起来您只想将一些IPC (Inter-Process Communication)合并到您的系统中。

在.NET(3.0以后版本)中实现此目标的最佳方法是使用Windows Communication Foundation (WCF) - 由Microsoft开发的通用框架,用于以各种不同方式(传输)在程序之间进行通信。

虽然我怀疑您可能希望使用命名管道以提高效率和健壮性,但还有许多其他传输可用,例如TCP和HTTP(请参阅this MSDN article) ,更不用说从二进制到XML到JSON的各种序列化格式。

答案 1 :(得分:2)

人们倾向于在分布式系统设计中遇到这种问题。它表现在Web Service(定义参数和返回类型的WSDL)消息传递系统中,消息的格式可能是XML或其他一些定义良好的格式。在所有情况下,控制客户端和服务器的耦合的问题仍然存在。

您的哈希表会发生什么?假设您的请求包含“NAME”和“PHONE-NUMBER”,突然您意识到您需要区分“LANDLINE-NUMBER”和“CELL-NUMBER”。如果只是更改哈希表条目以使用新值,那么您的服务器需要同时更改。假设此时您不仅拥有一个客户端和一个服务器,而且可能正在处理某种交换或代理系统,许多客户实施的许多客户端,许多团队实施的许多服务器。要求所有人同时升级到新的消息格式是一项艰巨的任务。

因此,我们倾向于寻求回溯可解决的解决方案,例如添加更改,我们保留“PHONE-NUMBER”并添加新字段。服务器现在可以容忍包含旧格式或新格式的邮件。

不同的分发技术对于后向兼容性具有不同的内置容忍度。在处理序列化类时,您可以处理新旧版本吗?在处理WSDL时,消息解析器是否容忍添加剂更改。

我会遵循以下流程:

1)。您是否在客户端和服务器之间有一个简单的关系,例如,您是否编码和控制它们,可以自由地指定它们的发布周期。如果“不”,则支持灵活性,使用哈希表或XML。

2)。即使您掌控着您的序列化框架支持版本控制的容易程度。强类型的序列化类接口可能更容易使用,只要您清楚地了解对接口进行更改将会采取的措施。

答案 2 :(得分:0)

内置的Remoting支持发生了什么?

http://msdn.microsoft.com/en-us/library/aa185916.aspx

如果需要,它适用于TCP / IP或IPC。它比WCF更快,并且对您的代码非常透明。

答案 3 :(得分:0)

你可以使用Sockets,Remoting或WCF,eash有利有弊。

但是如果性能不是很重要,你可以使用WCF并序列化和反序列化你的类,为了获得最大的性能,我建议使用套接字

答案 4 :(得分:-1)

根据我们在过去几年中广泛使用WCF进行各种绑定的经验,我们发现WCF不值得麻烦。

正确使用WCF会很复杂,包括正确处理通道上的错误,同时保持良好的性能(我们在早期就放弃了wcf的高性能)。

对于经过身份验证的客户端方案,我们切换到http rest(没有wcf)并执行json / protobuf payloading。

对于高速非认证方案(或至少是非kerberos认证方案),我们现在使用zeromq和protobuf。