3

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

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

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

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

谢谢!

4

5 回答 5

2

您将需要添加 [XmlSerializerFormat] 属性。

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

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

[XmlSerializerFormat]

公共接口 IBlah

{

[运营合同]

XmlDocument 返回xmldoc();

}

于 2008-12-18T10:41:47.113 回答
1

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

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

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

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

于 2008-11-21T12:42:32.123 回答
0

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

另外,我同意之前的海报以及 YAGNI 关于兼容性的评论。

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

于 2008-11-23T21:27:58.067 回答
0

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

我希望这有帮助。

干杯,瓦格纳。

于 2008-11-23T00:50:11.590 回答
0

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

于 2008-11-21T12:23:31.647 回答