C# 如何使用WCF SoapClient忽略反序列化(XmlSerializer)中的未知元素?

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”。如

我有一个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不是最好的方法。服务器端有订单属性吗?我不知道,因为我不是服务器端的程序员。这就是为什么我寻找一种方法,如果服务器端有一些小的变化,客户端的程序就不会出现大的问题。例如,某些更改会更改元素顺序。目前我的解决方案对我有效;)