2012-04-02 7 views
2

Ich habe eine WSDL von einem unserer Lieferanten gegeben worden, die enthält folgende Komponenten:WSDL generierten Code nicht lange in XML Deserialisieren richtig

<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> 

jedoch manchmal die Antwort, die ich wieder von ihnen nicht alle Felder enthalten . Zum Beispiel in diesem Fall:

<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> 

Nun ist die durch den Code in Visual Studio generierten Code, wenn ein Dienstverweis Hinzufügen nicht wie die Tatsache, dass die ClientAccNumber leer ist. Der generierte Code sieht wie folgt aus:

[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; 

ich einen ‚Input war nicht im richtigen Format‘ Ausnahme, wenn es die Antwort vom Server empfangen zu deserialisieren versucht. Was ich denke ist, dass es eine leere Zeichenkette sieht und versucht, es lange zu analysieren, was offensichtlich fehlschlägt. Ich habe versucht, minOccurs = "0" zur wsdl hinzuzufügen, die nicht geholfen hat.

Wie behebe ich die Wsdl, oder den generierten Code, um dieses Problem zu lösen? Oder gibt es noch etwas, das mir fehlt?

Antwort

0

würde ich den Code ändern, um die Eigenschaft als String zu definieren, und eine Nicht-XML-serializable Eigenschaft mit dem tatsächlichen Nullable<long> Wert, der zu/von der Zeichenfolge umgewandelt wird:

[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

Aber um um das zusätzliche Attribut hinzuzufügen, das ich brauche, um den generierten Code zu bearbeiten, was ein Albtraum wird, da jedes Mal, wenn die WSDL neu generiert wird, die Änderungen verloren gehen. – Dylan

+0

Sie haben eine WSDL, die nicht mit der XML übereinstimmt, die Sie erhalten - Sie müssen entweder die WSDL bei jeder Änderung reparieren oder den Code korrigieren, ich sehe keinen Weg. – MiMo

+0

Oder bitten Sie den Lieferanten, anstelle eines leeren Elements eine Null zu senden? Oder können Sie das XML irgendwie vorverarbeiten und korrigieren? – davidfrancis

Verwandte Themen