【问题标题】:WCF: Individual methods or a generic ProcessMessage method accepting xmlWCF:单个方法或接受 xml 的通用 ProcessMessage 方法
【发布时间】:2009-02-12 00:25:48
【问题描述】:

我的公司正在开发一个应用程序,该应用程序通过 TCP 套接字和 xml 消息从另一家公司接收数据。这被传送到单个网关应用程序,然后将其广播到我们组织中不同机器上同一内部应用程序的多个副本。

WCF 被选为处理内部通信(内部双向)的技术。开发人员考虑了两种方法。

  1. 由 每个不同的 WCF 服务 网关收到的消息 应用。网关 应用程序将解析传入的 外部消息并致电 适当的 WCF 服务方法。这 传入的 XML 将被翻译 进入 DataContract DTO 并提供 作为适当 WCF 的参数 方法。

  2. 内部应用程序 暴露了一个 WCF 服务 方法“ProcessMessage”,其中 接受 Xml 字符串消息为 争论。内部应用程序将 解析然后反序列化接收到的 xml并进行相应的处理。

首席开发人员认为选项二是更好的选择,因为它“更容易”序列化/反序列化 xml。我认为这个论点没有意义,因为 DataContracts 是由 WCF 序列化和反序列化的,并且通过使用 WCF,我们可以更好地键入我们的数据。在选项 2 中,有人可以调用 WCF 服务并传入任何字符串。我相信选项 1 提供了一个更简洁的界面,并使应用程序更易于维护和使用。

这两个选项在某些时候仍需要对原始 xml 字符串进行解析和验证,因此也可能是一个问题,建议在哪里执行此验证。

我想知道目前传递此类信息的想法是什么,以及人们对这两种选择的看法是什么。

【问题讨论】:

    标签: c# xml wcf architecture


    【解决方案1】:

    如果您可以确保客户端始终将数据合同的序列化表示形式发送到服务器,则选项 1 是合适的。

    但是,如果您需要序列化/反序列化逻辑的一些灵活性并且不与 DataContracts 紧密耦合,那么选项 2 看起来不错。当您想要支持 xml 的替代形式(例如 Atom 表示、自定义格式的原始 xml 等)时特别有用

    同样在 ProcessMessage() 方法中的选项 2 中,您可以选择是否 反序列化传入的 xml 有效负载(基于请求标头或特定于您的应用程序的内容) .

    在选项 1 中,WCF 运行时将始终反序列化有效负载。

    【讨论】:

      【解决方案2】:

      我最近就这个领域提出了几个问题:XML vs ObjectsXML vs Objects #2。您会发现这些问题的答案很有趣。

      对于我们的特定问题,我们决定采用混合方法,界面如下所示:

      // Just using fields for simplicity and no attributes shown.
      interface WCFDataContract
      {
          // Header details
          public int id;
          public int version;
          public DateTime writeDateTime;
      
          public string xmlBlob;
      
          // Footer details
          public int anotherBitOfInformation;
          public string andSoemMoreInfo;
          public book andABooleanJustInCase;
      
      }
      

      我们使用 xmlBlob 的原因是因为我们拥有页眉和页脚架构,但不拥有中间的 blob。此外,我们实际上不必处理该 blob,而只需将其传递给另一个库(由另一个部门创建)。另一个库返回给我们更强类型的数据。

      祝你好运 - 我从经验中知道,您的选项 2 可能非常诱人,有时很难反驳,而不会被指责过于纯洁和不够务实;)

      【讨论】:

      • 感谢这些链接。非常感谢:)
      【解决方案3】:

      我希望我理解正确。我认为让您的网关应用处理所有反序列化并让您的内部应用公开采用实际 DataContract 对象的 WCF 服务可能是有意义的。

      这样,您对基于 TCP 的 XML 的反序列化在网关上更加集中,您的内部应用程序无需担心,它们只需要公开任何有意义的 WCF 服务,并且可以处理实际的对象。

      如果您强制内部应用程序进行反序列化,那么如果格式发生变化或其他情况,您最终可能需要进行更多维护。

      所以我想我会说选项 1(除非我误解了)。

      【讨论】:

      • 你理解正确:) 我得出的结论是一样的。内部应该公开真正的服务,网关应该处理反序列化和广播/路由。
      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多