WCF:单个方法或接受xml的通用ProcessMessage方法

时间:2009-02-12 00:25:49

标签: c# xml wcf architecture

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

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

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

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

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

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

    我想知道当前传递这类信息的想法以及人们对这两种选择的看法。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我希望我明白这一点。我认为让您的网关应用程序处理所有反序列化并让您的内部应用程序公开带有实际DataContract对象的WCF服务可能是有意义的。

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

如果您强制内部应用程序执行反序列化,那么如果格式发生更改或其他原因,您最终可能会获得更多维护。

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

答案 2 :(得分:0)

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

对于我们的特殊问题,我们决定使用hybrod方法,界面看起来像这样:

// 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可能非常诱人,有时很难反对而不被指责为过于纯粹和不够务实;)