If you consume a SOAP web service via WCF, and the service doesn’t return its XML elements in the order specified by its WSDL, you may experience “mysterious
null values” in the deserialized response. This is because WCF enforces element ordering for sequences as defined by the XSD standard. If it encounters an element that’s not in the right place it simply gives up.
This is unfortunate if you are consuming a third party web service and you do not have control over the element ordering.
As a workaround you can generate proxies that serialize with
XmlSerializer instead of
DataContractSerializer, and then remove the element ordering information from the proxy code. Fortunately (with a little help from
sed) this can be automated. You’ll need to add a Pre-Build action to your project, and populate it like so:
set proxy_tool="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SvcUtil.exe" /nologo /t:code /ser:XmlSerializer /UseSerializerForFaults set sed_tool="$(ProjectDir)sed.exe" -r -i "s/,?[[:space:]]*Order=[[:digit:]]+//" %proxy_tool% /o:"Proxy1.cs" /n:*,Namespaces.Name1 "Proxy1.wsdl" %sed_tool% "Proxy1.cs" %proxy_tool% /o:"Proxy2.cs" /n:*,Namespaces.Name2 "Proxy2.wsdl" %sed_tool% "Proxy2.cs" ...
Pingback: DataContract deserialization fails due to incorrect ordering of XML nodes - QuestionFocus