【问题标题】:Should I use WCF for a simple textual wire protocol?我应该将 WCF 用于简单的文本有线协议吗?
【发布时间】:2011-07-20 22:00:16
【问题描述】:

我需要编写一个可以与其他 .NET 程序通信的程序……但也需要一个通过 TCP 的旧版 VFP 程序。我需要选择一个 VFP 程序员可以使用的相当简单的 TCP 消息格式。它可以像一系列由...分隔的小 XML blob 一样简单,我不知道,一个空字符?随便。

我需要在 TcpListener/TcpClient 和 WCF 之间进行选择。我开始研究 WCF,但它的架构似乎不透明,并且内置的 Visual Studio 模板严重偏向于制作类似于 RPC 机制的“Web 服务”,但需要一个特殊的“主机”或应用程序外部的 Web 服务器.微软的6-stage tutorial 让 WCF 听起来很麻烦(涉及代码生成器、命令行和 XML 废话,只是为了远程减去或乘以两个数字)。

我想要一个独立的应用程序(没有“主机”),我想要控制有线协议,并且我想了解它是如何工作的。WCF 似乎不能促进这些事情,所以我放弃了 TcpListener/TcpClient 的因素。

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

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

  1. Web 上哪里可以很好地解释 WCF 的体系结构?或者我需要一本书吗?
  2. 如何在 WCF 中进行双向通信,其中(单个 TCP 连接的)任何一方都可以随时发送消息?
  3. 如何通过所有的 Web 服务和 RPC mumbo-jumbo,并控制有线协议?
  4. 在 WCF 中,如何干净地关闭应用程序,同时关闭所有连接,而无需使用 Thread.Abort() 命令?

如果不是,我该如何设置我的代码(使用 TcpListener/TcpClient/NetworkStream),以便我可以从 NetworkStream 读取消息,但也可以接受来自其他连接的请求,随时干净地关闭,并避免浪费 CPU 时间轮询处于非活动状态的队列和 NetworkStream?

【问题讨论】:

  • VFP可以调用COM对象吗?如果是这样,则创建一个 .NET 类库,将其公开给 COM,并使用它与 WCF 对话。
  • @John Saunders:是的,我相信它可以通过CreateObject 函数调用。然而,在这种情况下,最好使用 CreateObject 以便通过 COM+ 集成访问代理(参见此处的清单 10-11:msdn.microsoft.com/en-us/library/bb735856.aspx
  • @John,VFP 可以使用 COM,但与我的判断相反,我的主管希望中介能够在不同的机器上运行。这意味着 DCOM,我不知道如何使用。由于VFP <-> intermediary 之间的消息与intermediary <-> clients 之间的消息相似,我认为最好同时使用 TCP。

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


【解决方案1】:

简短的回答:使用 WCF。虽然有大量的工具和代码生成以及其他花里胡哨的东西,但没有什么能阻止您在代码中设置所有内容(您可以在代码中定义合同、设置端点等)。

对于您的具体问题:

  1. WCF Architecture - 这是非常基本的,它应该能让你相对快速地启动和运行。
  2. 您正在寻找的是duplex services。 NetTcpBinding 允许开箱即用的双工服务(尽管您可以使用 HTTP 来实现,但您需要一个特定的绑定)。
  3. 如果您想控制线路格式,您需要创建一个custom encoder。但是,我必须强烈反对它。您想创建一个带有空字符的 XML 文件来描述单独的消息吗?没有必要,XML 的本质是您可以创建子元素来执行适当的分组;您可以嵌套多少元素没有限制。真的没有这个必要。
  4. 只需通过调用Close 来关闭ServiceHost,这将允许所有未完成的请求完成,然后正常关闭。如果你真的想无忧无虑地拆,那就打电话给Abort

最后,我强烈建议您不要使用 NetTcpBinding; VFP 将很难使用该协议。但是,如果您使用基于 HTTP 的协议,总有一些工具可以让 VFP 轻松地进行调用和使用内容(假设您坚持使用 XML)。

【讨论】:

  • 没有任何分隔符,从网络流中读取的代码如何知道消息已经结束并且不应该阻塞等待更多数据?
  • @Qwertie:假设他们正在使用 WCF;如果是这种情况,那么这些是由低级别的绑定处理的,没有理由在消息编码中担心这一点。如果在 VFP 中使用 WCF,应该是通过 COM+ 集成,他们不必担心底层的东西。
  • @casperOne:“他们”使用 WCF 的假设是不正确的。 VFP 是一种已停产的非 .NET 技术,因此它不能使用 WCF;这就是为什么我担心有线协议(嗯,那个和效率——我想保持低带宽)。
  • 顺便说一下,我们的开发人员有某种用于对 SOAP 进行同步调用的第 3 方模块。不过,我有点不知所措,因为我并不真正了解 VFP 代码或 SOAP(以及它与 WCF 的关系),而我们的 VFP 开发人员不了解 .NET。希望谷歌能帮我解决这一切......
  • @Qwertie:如果 VPF 开发人员有一个可以进行soap 调用的模块,那么您将需要考虑使用BasicHttpBinding、WSHttpBinding 或WS2007HttpBinding 公开您的服务。您可以在 msdn.microsoft.com/en-us/library/ms730294.aspx 看到每个绑定支持的内容 - 您所要做的就是使用正确的绑定公开服务,VPF 开发人员应该可以毫无问题地使用您的输出。
【解决方案2】:

只是补充关于使用 DCOM 的一个常见问题,VFP 可以使用 DCOM,但需要使用 CreateObjectEx() 来完成......唯一的大区别是您需要知道您正在连接的类实例的 GUID在它连接到的任何服务器上,以及它将连接到的机器名称。

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

早在 10 年前,我就曾为一家保险公司使用 VFP 进行 DCOM...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多