我应该使用WCF作为简单的文本线协议吗?

时间:2011-03-22 23:09:11

标签: c# .net wcf architecture visual-foxpro

我需要编写一个与其他.NET程序通信的程序......还需要一个基于TCP的传统VFP程序。我需要选择VFP程序员可以使用的相当简单的TCP消息格式。它可以像一系列由...分隔的小XML blob一样简单。我不知道,一个空字符?不管。

我需要在TcpListener / TcpClient和WCF之间进行选择。我开始研究WCF,但它的体系结构似乎不透明,内置的Visual Studio模板非常偏向于使“Web服务”像一种RPC机制,但需要一个特殊的“主机”或应用程序外部的Web服务器。微软的6-stage tutorial使得WCF听起来非常麻烦(涉及代码生成器,命令行和XML垃圾只是为了远程减去或乘以两个数字)。

我想要一个独立的应用程序(没有“主机”),我想要控制有线协议,我想了解它是如何工作的。 WCF似乎不方便这些东西,所以我把它放在TcpListener / TcpClient因子中。

但是,该程序将作为单个(VFP)服务器和许多(.NET)客户端之间的中介,并且将在两个方向和不同连接之间进行通信。使用TcpListenerTcpClient,处理连接和线程的工作变得有点混乱,我没有使用IAsyncResult的经验,而且我不仅对我的代码质量没有信心

所以我想再次征求意见:我还应该考虑WCF吗?如果是,您能指出我对以下问题的答案吗?

  1. 网络中哪里是对WCF架构的一个很好的解释?或者我需要一本书吗?
  2. 如何在WCF中完成双向通信,其中任何一方(单个TCP连接)可以随时发送消息?
  3. 如何通过所有网络服务和RPC mumbo-jumbo,并控制线路协议?
  4. 在WCF中,如何干净地关闭应用程序,并行关闭所有连接而不使用hacky Thread.Abort()命令?
  5. 如果不是,我如何设置我的代码(使用TcpListener / TcpClient / NetworkStream)以便我可以从NetworkStream读取消息,但也接受来自其他连接的请求,随时关闭,并避免浪费CPU时间来轮询无效的队列和NetworkStream?

2 个答案:

答案 0 :(得分:3)

答案简短:跟WCF一起去吧。虽然它周围有大量的工具和代码生成以及其他花哨的东西,但没有什么能阻止你在代码中设置所有东西(你可以定义你的合同,设置端点等等所有代码)。

针对您的具体问题:

  1. WCF Architecture - 这是非常基本的,它可以让你相对快速地运行起来。
  2. 您要找的是duplex services。 NetTcpBinding允许开箱即用的双工服务(虽然您可以使用HTTP,但您需要特定的绑定)。
  3. 如果要控制有线格式,则需要创建custom encoder。但是,我必须强烈推荐它。您想创建一个带有空字符的XML文件来描述单独的消息吗?没有必要,XML的本质是你可以创建子元素来执行适当的分组;你可以嵌套多少元素没有限制。真的没有必要这样做。
  4. 只需通过调用ServiceHost关闭Close,即可完成所有未完成的请求,然后优雅地关闭。如果你真的想毫无顾虑地拆除,请拨打Abort
  5. 最后,我强烈建议你不要使用NetTcpBinding; VFP将很难耗费协议。但是,如果您使用基于HTTP的协议,则VFP始终可以轻松使用这些工具进行调用并使用内容(假设您坚持使用XML)。

答案 1 :(得分:1)

为了解决使用DCOM的常见问题,VFP可以使用DCOM,但需要使用CreateObjectEx()...唯一的区别是你需要知道你要连接的类实例的GUID在它连接的任何服务器上,以及它要连接的机器名称。

然后远程对象通过公开的函数完成它的工作,但VFP从网络上的其他一些机器调用它就像对待本地函数一样处理它并获得返回值。

我甚至早在10年前就为一家保险公司做过VOM DCOM ......