WCF数据契约/服务操作涉及.NET XmlDocument类型

3
我想了解在WCF通信中如何发送数据合同。为了实现互操作性,不建议(或者甚至不允许?)将本机.NET类型作为数据合同的一部分发送。
我希望有一个服务可以接受.NET XmlDocument 类型作为 ServiceOperation 的输入。如果我创建一个包装类(用 DataContract 属性标记),其中包含一个 XmlDocument 类型(用 DataMember 属性标记),并将其用作 ServiceOperation 的参数 - 那么这是否合法/可能?
如何确保互操作性,同时仍具有 XmlDocument 类型的便利性?接受 string 作为 ServiceOperation 的参数,然后在服务端使用 XmlDocument.LoadXml(string) 方法来实例化 XmlDocument 是否是更好的设计选择?
谢谢任何帮助/意见/评论,我刚开始掌握 WCF,所以在着手创建服务之前,我只想澄清我的头脑中的任何困惑。
谢谢!
5个回答

2

您需要添加[XmlSerializerFormat]属性。

因此(不使用Datacontract,尽管您也可以使用它):

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

[XmlSerializerFormat]

public interface IBlah

{

[OperationContract]

XmlDocument Returnxmldoc();

}


那是从Scott Mason那里抄袭的,干得好。 - Mark

1

往往情况下,开发人员编写代码是为了“互操作性”,而实际上他们根本没有理由或需要这样做。

使用本机.NET类型完全可以。例如:您会为了序列化而拆分“Point”成两个整数吗?

不幸的是,System.Xml.XmlDocument...无法序列化 :)

但是,您可以使用“XElement”...它在System.Xml.Linq命名空间中完美运行。


0

传递字符串对于交互来说更好,但如果您想传递CLR数据类型,可以考虑使用KnownType属性标记您的类。


0
在你的第二种情况下,我会创建一个数据契约在一个单独的dll中,并在两个应用程序中引用它(我猜你对两个服务都有控制权)。因此,当你在Service B中创建Service A的代理类时,你可以说你的数据契约来自已知类型,并指向数据契约dll。顺便说一句,VS 2008默认就是这样做的。如果你使用的是.NET 3.0,你可能需要使用svcutil手动创建这些类。
希望这能帮到你。
祝好,Wagner。

0

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

另外,我同意之前帖子中关于兼容性的YAGNI评论。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接