我应该在简单文本协议中使用WCF吗?

3
我需要编写一个程序,可以与其他 .NET 程序通信...但也要与传统的 VFP 程序通过 TCP 进行通信。我需要选择一种相当简单的 TCP 消息格式,使 VFP 程序员可以使用。它可以是一系列由 null 字符分隔的小 XML 块的序列,或者其他什么形式都可以。
我需要在 TcpListener/TcpClient 和 WCF 之间进行选择。我开始研究 WCF,但它的架构似乎很不透明,并且内置的 Visual Studio 模板非常偏向于制作像一种 RPC 机制的“Web 服务”,但需要一个特殊的“主机”或 Web 服务器,这个服务器是应用程序外部的。而微软的6-stage tutorial让 WCF 听起来相当繁琐(需要代码生成器、命令行和 XML 等等才能远程减去或乘以两个数字)。
我想要一个自包含的应用程序(没有“主机”),我想要控制线路协议,并且我想要理解它的工作原理。WCF 似乎无法促成这些事情,因此我放弃了它,转而使用 TcpListener/TcpClient。
然而,该程序是作为单个(VFP)服务器和许多(.NET)客户端之间的中介服务,将有双向通信和跨不同连接。使用 TcpListenerTcpClient,处理连接和线程的工作变得有点混乱,我没有使用 IAsyncResult 的经验,并且对我的代码质量没有信心。
所以我想再次征求意见:我是否应该考虑使用 WCF?如果是,你能指点我以下问题的答案吗?
  1. 哪里有关于WCF架构的好解释?或者我需要一本书吗?
  2. 在WCF中如何进行双向通信,其中任意一方(单个TCP连接的任何一面)都可以随时发送消息?
  3. 如何摆脱所有Web服务和RPC mumbo-jumbo,并控制传输协议?
  4. 在WCF中,如何优雅地关闭应用程序,同时关闭所有连接而不使用hacky Thread.Abort()命令?
如果不是这样,我该怎么设置代码(使用TcpListener / TcpClient / NetworkStream)以便我可以从NetworkStream读取消息,但也接受来自其他连接的请求,在任何时候都可以干净地关闭,并避免浪费CPU时间轮询处于非活动状态的队列和NetworkStreams?

VFP能否调用COM对象?如果可以,那么创建一个.NET类库,将其暴露给COM,并使用它来与WCF通信。 - John Saunders
@John Saunders:是的,我相信它可以通过CreateObject函数调用实现。但在这种情况下,最好使用CreateObject以便通过COM+集成访问代理(请参见此处的10-11清单:http://msdn.microsoft.com/en-us/library/bb735856.aspx)。 - casperOne
@约翰,VFP可以使用COM,但与我的判断相反,我的主管希望中间件能够在不同的机器上运行。这意味着需要使用DCOM,而我不知道如何使用。由于“VFP <-> 中间件”之间的消息与“中间件 <-> 客户端”之间的消息类似,所以我认为最好同时使用TCP。 - Qwertie
2个回答

3
简短回答:选择WCF。虽然它有很多工具和代码生成以及其他附加功能,但没有任何东西会阻止您在代码中设置所有内容(您可以定义契约、设置端点等)。
针对您的特定问题:
  1. WCF架构 - 这很基础,应该能够让你相对快速地上手。
  2. 你要找的是双工服务。NetTcpBinding允许开箱即用的双工服务(虽然你可以使用HTTP做到这一点,但需要特定的绑定)。
  3. 如果你想控制线路格式,你需要创建一个自定义编码器。然而,我强烈不建议这样做。你想创建一个带有空字符的XML文件来划分不同的消息吗?没有必要,XML的本质就是你可以创建子元素来执行适当的分组;你可以嵌套任意多个元素。真的没有必要这么做。
  4. 只需通过调用Close简单地关闭ServiceHost,这将允许所有未完成的请求完成,然后优雅地关闭。如果你真的想毫不关心地拆除,那么调用Abort
最后,我强烈建议您不要使用NetTcpBinding协议; VFP将难以消费该协议。但是,如果您使用基于HTTP的协议,则始终存在可以轻松使用VFP进行调用和消费内容的工具(假设您坚持使用XML)。

没有任何分隔符,从网络流中读取的代码如何知道消息何时结束,以及它不应该阻塞等待更多数据? - Qwertie
@Qwertie:假设他们正在使用WCF;如果是这种情况,那么这些都由绑定在低级别上处理,没有必要在消息编码中担心这个问题。如果在VFP中使用WCF,则应通过COM+集成进行,他们不必担心低级别的东西。 - casperOne
@casperOne:假设“他们”正在使用WCF是不正确的。VFP是一种已停止的非.NET技术,因此无法使用WCF;这就是为什么我担心传输协议(以及效率 - 我希望保持带宽低)的原因。 - Qwertie
1
@Qwertie:如果VPF开发人员有一个可以进行SOAP调用的模块,那么您需要考虑使用BasicHttpBinding、WSHttpBinding或WS2007HttpBinding来公开您的服务。您可以在http://msdn.microsoft.com/en-us/library/ms730294.aspx上查看每个绑定支持的内容-您所要做的就是使用正确的绑定公开服务,VPF开发人员应该没有问题使用您的输出。 - casperOne
我找到了一个MSDN的“UDP传输”示例(WF_WCF_Samples\WCF\Extensibility\Transport\Udp),它实现了最底层的UDP支持,但是它非常复杂,使用了21个类来实现UDP传输(不包括在其之上构建的服务或客户端)。如果我能弄清楚它是如何工作的,那么它可能会很有用/具有教育意义 :) - Qwertie
显示剩余3条评论

1

关于DCOM的常见用法,VFP可以利用DCOM,但需要使用CreateObjectEx()函数...唯一的区别是您需要知道要连接到的类实例的GUID以及它要连接到的服务器的机器名称。

然后,远程对象通过公开的函数执行其工作,但是VFP从网络上的其他计算机调用它时,将其视为在本地执行该函数并获取返回值。

我甚至在10年前就为一家保险公司使用VFP进行了DCOM操作...


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