【问题标题】:WCF DataContract/ServiceOperation involving .NET XmlDocument typeWCF DataContract/ServiceOperation 涉及 .NET XmlDocument 类型
【发布时间】:2008-11-21 10:39:42
【问题描述】:

我只是想知道要在 WCF 通信中通过线路发送的数据合同。我知道为了互操作性,不建议(甚至不允许?)将本机 .NET 类型作为数据合同的一部分发送。

我希望有一个服务接受,作为ServiceOperation 的输入,.NET XmlDocument 类型。如果我要创建一个包含XmlDocument 类型(将用DataMember 属性标记)的包装类(将用DataContract 属性标记),并将其用作ServiceOperation 的参数- 这是否合法/可能?

我怎样才能确保互操作性,同时仍然具有XmlDocument 类型的便利性?接受string 作为ServiceOperation 的参数然后在服务端使用XmlDocument.LoadXml(string) 方法实例化XmlDocument 是否是更好的设计选择?

为任何帮助/意见/cmets 欢呼,我刚刚开始掌握 wcf,所以我只想在我开始创建服务之前清除我脑海中的任何困惑。

谢谢!

【问题讨论】:

    标签: .net wcf datacontract datamember


    【解决方案1】:

    您需要添加 [XmlSerializerFormat] 属性。

    所以(虽然你也可以使用 Datacontract,但不使用它):

    [ServiceContract(Namespace = "urn:SerializationTest")]

    [XmlSerializerFormat]

    公共接口 IBlah

    {

    [操作合同]

    XmlDocument 返回xmldoc();

    }

    【讨论】:

    【解决方案2】:

    通常情况下,开发人员为了“互操作性”而编写代码,而他们真的没有理由/根本不需要这样做。

    使用本机 .NET 类型是完全可以的。示例:为了序列化,您会将“Point”分解为两个整数吗?

    遗憾的是,System.Xml.XmlDocument ... 不可序列化:)

    不过,您可以使用“XElement”……它工作得很好(在 System.Xml.Linq 命名空间中)。

    【讨论】:

      【解决方案3】:

      传递一个字符串对于互操作来说会更好,但如果你想传递 CLR 数据类型,你可以考虑用 KnownType 属性标记你的类。

      【讨论】:

        【解决方案4】:

        在您的第二种情况下,我会在一个单独的 dll 中创建一个数据合同,并在两个应用程序上引用它(我猜您对这两个服务都有控制权)。因此,当您在服务 B 中为服务 A 创建代理类时,您可以说您的数据合同来自已知类型并且指向数据合同 dll。 BTW VS 2008 默认情况下会这样做。如果您使用的是 .NET 3.0,则可能需要使用 svcutil 手动创建类。

        我希望这会有所帮助。

        干杯,瓦格纳。

        【讨论】:

          【解决方案5】:

          您的 XML 文档有 XSD 吗?如果是这样,使用 svcutil.exe (svcutil.exe /dconly schemaName.xsd) 生成 DataContract 复合结构非常容易。此时,您可以选择使用DataContractSerializer 在您的 XML 文档和可用于您的服务接口和您的实现的 DataContracts 组合之间移动(如果您选择这样做的话)。

          另外,我同意之前发布者对 YAGNI 关于兼容性的评论。

          JB http://jb-brown.blogspot.com

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多