2012-04-02 129 views
2

我已經通過我們的供應商之一,給予了WSDL包含下面的代碼不反序列化長XML: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或生成的代碼來解決此問題?還是有什麼我失蹤?

回答

0

我會改變的代碼來定義屬性作爲字符串,並有一個非XML序列化的特性與實際Nullable<long>值被轉換到/從字符串:

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tpwebservice.x.com", Order=5)] 
[System.Xml.Serialization.XmlElementAttribute("ClientAccNumber", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
public string ClientAccNumberStr; 

[System.Xml.Serialization.XmlIgnoreAttribute] 
public System.Nullable<long> ClientAccNumber { 
    get { 
    if (string.IsNullOrEmpty(ClientAccNumberStr)) 
     return null; 
    return long.Parse(ClientAccNumberStr); 
    } 
    set { 
    if (!value.HasValue) { 
     ClientAccNumberStr = null; 
    } else { 
     ClientAccNumberStr = value.Value.ToString(); 
    } 
    } 
} 
+0

但爲了添加額外的屬性,我需要編輯生成的代碼,這成爲一個噩夢,因爲每次WSDL重新生成時,更改都會丟失。 – Dylan 2012-04-02 20:55:56

+0

您的WSDL與您獲得的XML不匹配 - 您將在每次修改WSDL或修復代碼時修復WSDL,但我沒有看到解決方法。 – MiMo 2012-04-02 21:38:02

+0

或者要求供應商發送一個零而不是空的元素?或者你可以以某種方式預處理他們的XML並糾正它是必要的? – davidfrancis 2012-04-02 21:40:44