【发布时间】:2012-04-02 19:22:34
【问题描述】:
我们的一个供应商给了我一个 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 或生成的代码来解决这个问题?还是我还缺少其他东西?
【问题讨论】:
标签: c# wcf web-services soap wsdl