Один из наших поставщиков дал мне WSDL, в котором содержится следующее:
<xsd:element name="RegistrationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="DateTimeStamp" type="xsd:dateTime" nillable="true"/>
<xsd:element name="EchoData" type="xsd:string" nillable="true"/>
<xsd:element name="TransactionTrace" type="xsd:long" nillable="true"/>
<xsd:element name="ResponseCode" type="xsd:int" nillable="true"/>
<xsd:element name="ResponseMessage" type="xsd:string" nillable="true"/>
<xsd:element name="ClientAccNumber" type="xsd:long" nillable="true"/>
<xsd:element name="BranchCode" type="xsd:int" nillable="true"/>
<xsd:element name="HIN" type="xsd:long" nillable="true"/>
<xsd:element name="EasyPayRef" type="xsd:long" nillable="true"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Однако иногда ответ, который я получаю от них, не будет содержать все поля. Например, в этом случае:
<soapenv:Body>
<tpw:RegistrationResponse>
<DateTimeStamp>
2012-04-02T19:10:41.4430564Z
</DateTimeStamp>
<EchoData/>
<TransactionTrace>
5418721751027669946
</TransactionTrace>
<ResponseCode>
25
</ResponseCode>
<ResponseMessage>
Invalid Mobile Account Type
</ResponseMessage>
<ClientAccNumber/>
<BranchCode/>
<HIN>
0
</HIN>
<EasyPayRef/>
</tpw:RegistrationResponse>
</soapenv:Body>
Теперь код, сгенерированный кодом в Visual Studio при добавлении ссылки на службу, не похож на тот факт, что ClientAccNumber не указан. Сгенерированный код выглядит следующим образом:
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tpwebservice.x.com", Order=5)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public System.Nullable<long> ClientAccNumber;
Я получаю исключение «Введен неверный формат», когда он пытается десериализовать ответ, полученный от сервера. Я думаю, что он видит пустую строку и пытается разобрать длинную строку, что, очевидно, не удается. Я попытался добавить minOccurs = "0" в wsdl, который не помог.
Как исправить wsdl или сгенерированный код для решения этой проблемы? Или мне чего-то не хватает?