Код, сгенерированный WSDL, долго не десериализуется в XML - PullRequest
2 голосов
/ 02 апреля 2012

Один из наших поставщиков дал мне 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 или сгенерированный код для решения этой проблемы? Или мне чего-то не хватает?

1 Ответ

0 голосов
/ 02 апреля 2012

Я бы изменил код, чтобы определить свойство как строку, и имел бы свойство не-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();
    }
  }
}
...