涉及.NET XmlDocument类型的WCF DataContract / ServiceOperation

时间:2008-11-21 10:39:42

标签: .net wcf datacontract datamember

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

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

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

欢呼任何帮助/观点/评论,我只是开始掌握wcf所以我只是想在我首先开始创建服务之前清除头脑中的任何困惑。

谢谢!

5 个答案:

答案 0 :(得分:2)

您需要添加[XmlSerializerFormat]属性。

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

[ServiceContract(Namespace =“urn:SerializationTest”)]

[XmlSerializerFormat]

公共接口IBlah

{

[OperationContract的]

XmlDocument Returnxmldoc();

}

答案 1 :(得分:1)

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

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

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

你可以使用“XElement”但是效果很好(在System.Xml.Linq命名空间中)。

答案 2 :(得分:0)

传递字符串对于互操作会更好,但如果要传递CLR数据类型,可以考虑使用KnownType属性标记类。

答案 3 :(得分:0)

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

我希望这会有所帮助。

干杯,瓦格纳。

答案 4 :(得分:0)

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

此外,我同意之前的海报与YAGNI关于兼容性的评论。

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