0

こんにちは、WCF クライアントを介して Apache 軸上に構築された SOAP 1.1 サービスを使用しています。問題は、フォールトと通常の応答の両方が WCF のビルトイン デシリアライザーによって解析されず、wcf クライアント経由で Web 操作を呼び出すときに XML 解析に関連する例外が発生することです。メッセージを調べると、次のようになりました。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
  <soapenv:Body>
    <V2Response xmlns="urn:ETS">
      <V2Return xsi:type="ns1:TResponse" xmlns:ns1="urn:ETS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <fulfilmentRef></fulfilmentRef>
        <paymentRef></paymentRef>
        <statusCode>2013</statusCode>
        <statusDescription>ePayments: Invalid client password specified in request.</statusDescription>
        <transactionId xsi:nil="true" />
        <transactionTimeStamp>2013-06-21T08:22:16.483Z</transactionTimeStamp>
      </V2Return>
    </V2Response>
  </soapenv:Body>
</soapenv:Envelope>

私が得ている例外は次のとおりです。

> The specified type was not recognized: name='TResponse', namespace='urn:ETS', at <V2Return xmlns='urn:ETS'>

に有効なTResponseクラスがReference.csあります。構成を変更することでこれを処理できるかどうか教えてください。WCF クライアントが SOAP メッセージを解析することを期待していましたが、できませんでした。サーバー側で何も変更できません。これはサード パーティの API です。 .

4

1 に答える 1

1

svcutil.exe によって生成されたプロキシ クラスで名前空間を手動で変更することで、この問題を解決できます。「TResponse」クラスには、プロキシ コードで定義されたいくつかの異なる名前空間があります。名前空間を urn:ETS に変更すると、soap 応答がクラスに簡単に逆シリアル化されます。その前に、SoapUI からの応答を確認し、soap の応答を検証しましたが、すべてが完璧に見えたので、SO を検索して This urlを見つけました。例外をもう一度読んだ後、問題が名前空間にあることに気付きました。

以下は私が行った変更です:

/// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4927")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://axis.webservices.api.etransactions")]
    public partial class TResponse : object, System.ComponentModel.INotifyPropertyChanged {
        ........

「 http://axis.webservices.api.etransactions」を「urn:ETransactionsService」に置き換えたところ、うまくいきました:)!

于 2013-06-26T10:57:46.960 に答える