我希望有一个服务接受一个.NET ServiceOperation
类型作为XmlDocument
的输入。如果我要创建一个包装类(将标有DataContract
属性),该类包含XmlDocument
类型(将使用DataMember
属性标记),并将其用作ServiceOperation
的参数 - 这是合法/可能的吗?
我如何确保互操作性,同时仍然具有XmlDocument
类型的便利性?接受string
作为ServiceOperation
的参数,然后使用服务端的XmlDocument
方法实例化XmlDocument.LoadXml(string)
,可能是更好的设计选择吗?
谢谢!
答案 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关于兼容性的评论。