2012-04-02 2 views
2

をデシリアライズないコードを生成しました。この例では例えば:WSDLは、私は、次のものが含まれている私たちのサプライヤーの一つでWSDLを与えてきた適切にXMLに長い

<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

私は、文字列としての性質を定義するためにコードを変更し、文字列へ/から変換された実際のNullable<long>値と非XMLシリアル化の特性を持っていると思います:

[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

+0

WSDLが取得しているXMLと一致しません。WSDLが修正されるたびにコードを修正するか、コードを修正する必要があります。回避策はありません。 – MiMo

+0

または、サプライヤーに空の要素の代わりにnilを送信するよう依頼しますか?あるいは、どうにかしてXMLを前処理して修正する必要がありますか? – davidfrancis

関連する問題