C# 如何使用WCF SoapClient忽略反序列化(XmlSerializer)中的未知元素?
我有一个C#项目,其中我通过WSDL文件添加了一个WCF服务引用。因为我不想使用“DataContractSerializer”,所以我更改了“Reference.svcmap”并将序列化程序设置为“XmlSerializer”。在这一点上,一切都很完美 现在来谈谈问题。该服务不是我的服务,它可以是,该服务的程序员向结果类添加属性,而我不能同时更新我的引用。因此,我导入的WSDL可能已经过时。在这种情况下,反序列化后的结果不正确 例如,结果具有属性“Name”、“Street”和“Town”。如果服务现在返回C# 如何使用WCF SoapClient忽略反序列化(XmlSerializer)中的未知元素?,c#,web-services,wcf,wsdl,xml-serialization,C#,Web Services,Wcf,Wsdl,Xml Serialization,我有一个C#项目,其中我通过WSDL文件添加了一个WCF服务引用。因为我不想使用“DataContractSerializer”,所以我更改了“Reference.svcmap”并将序列化程序设置为“XmlSerializer”。在这一点上,一切都很完美 现在来谈谈问题。该服务不是我的服务,它可以是,该服务的程序员向结果类添加属性,而我不能同时更新我的引用。因此,我导入的WSDL可能已经过时。在这种情况下,反序列化后的结果不正确 例如,结果具有属性“Name”、“Street”和“Town”。如
<?xml version="1.0" encoding="UTF-8"?>
<TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Tim</Name>
<Street>Samplestreet</Street>
<Town>Sampletown</Town>
</TestResult>
<?xml version="1.0" encoding="UTF-8"?>
<TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Tim</Name>
<FullName>Tim Brown</FullName>
<Street>Samplestreet</Street>
<Town>Sampletown</Town>
</TestResult>
提姆
样本树
样本镇
我的结果具有以下值:
Name=Tim街道=采样街
城镇=样本城镇
如果服务程序员现在在“Name”和“Street”之间添加属性“Fullname”,并且我的WSDL导入已过期,那么结果将变得不正确。服务返回
<?xml version="1.0" encoding="UTF-8"?>
<TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Tim</Name>
<Street>Samplestreet</Street>
<Town>Sampletown</Town>
</TestResult>
<?xml version="1.0" encoding="UTF-8"?>
<TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Tim</Name>
<FullName>Tim Brown</FullName>
<Street>Samplestreet</Street>
<Town>Sampletown</Town>
</TestResult>
提姆
蒂姆·布朗
样本树
样本镇
但反序列化后,我的结果具有以下值:
Name=Tim街道=空
城镇=零 看起来WCF的XmlSerialzier在发现未知元素时停止了反序列化,没有异常 问题是,是否有设置、配置服务引用的方法、SoapClient或Serializer以忽略未知元素并像标准XmlSerialzier一样继续进行反序列化—如何返回它知道的所有值
或者有没有办法在WCF SoapClient的客户端使用自己的Serialzier?您可以尝试向类TestResult添加其他属性,并用XmlAnyElement标记它:
[XmlAnyElement]
public XmlElement[] AllElements;
对于DataContract、DataMember样式,您可以实现IExtensibleDataObject接口:
由于“Legart”的答案,我查看了生成的文件“Reference.cs”并找出了当服务向我发送一个包含未知服务引用新元素的结果时,我得到错误反序列化结果的原因
问题在于,在生成的引用文件中“xmlementarributes”有一个名为“Order”的参数。如果服务现在向我发送了一个新的未知元素,那么这个元素可能会改变元素的顺序,然后反序列化将返回错误的结果
我当前的解决方案是删除属性中的所有“Order”参数。然后,服务器结果中更改的顺序和添加的元素对反序列化没有影响。就像新的未知元素会被忽略一样
这不是最好的解决方案,因为我必须编辑生成的文件,但目前它对我有效
如果您知道更好的方法,请写一条评论。谢谢您的回答。不幸的是,这并不能解决我的问题,但它帮助我找到了真正的问题,为什么我会成为一个错误的序列化结果。更多信息,请参阅我的答案。是的,编辑reference.cs不是最好的方法。服务器端有订单属性吗?我不知道,因为我不是服务器端的程序员。这就是为什么我寻找一种方法,如果服务器端有一些小的变化,客户端的程序就不会出现大的问题。例如,某些更改会更改元素顺序。目前我的解决方案对我有效;)