1

Visual Studio 2005 で WSE 3.0 をクライアントとして使用して、サード パーティの Web サービスを呼び出そうとしています。

呼び出しは正常に機能し、良好な応答が得られることがわかります (トレースが有効になっています) が、xml パーサーがそれを詰まらせているようです。私はいつも得るInvalidOperationException

XML ドキュメントにエラーがあります。

InnerException

指定されたタイプが認識されませんでした: name='Map', namespace=' http://xml.apache.org/xml-soap ', at <bevoegdheid xmlns=''>.

これは、応答の関連部分です。

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="https://acceptatie.cartalk.nl/Soap/Apk" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
      <SOAP-ENV:opvragenKeurmeesterGegevensResponse>
        <opvragenKeurmeesterGegevensReturn xsi:type="ns2:Backend_Apk_Result_OpvragenKeurmeesterGegevens">
          <naam xsi:type="xsd:string">A name</naam>
          ...
          <bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">
            <item xsi:type="ns1:Map">
              <item>
                <key xsi:type="xsd:string">soortBevoegdheid</key>
                <value xsi:type="xsd:string">AL</value>
              </item>
          ...
            </item>
            <item>
          ...
            </item>
          </bevoegdheid>
          <meldingSoort xsi:nil="true" />
          <meldingNummer xsi:nil="true" />
          <melding xsi:nil="true" />
        </opvragenKeurmeesterGegevensReturn>
      </SOAP-ENV:opvragenKeurmeesterGegevensResponse>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

そして、これは「bevoegdheid」がwsdlでどのように定義されているかです:

  <xsd:element name="bevoegdheid" type="soap-enc:Array" /> 

wsdl のどこにも「Map」タイプについての言及はありません。

私はこれについてグーグルで調べてきましたが、私が見つけた唯一の種類の答えは、次のようなものです

このサービスは、相互運用性を確保するのが難しい rpc/encoded 形式を使用します。サーバーを document/literal に変更できる場合は、そのほうがよいでしょう。

しかし、これはサード パーティのサービス (他のクライアントによって既に使用されている) であるため、これは私たちの選択肢ではありません。

他の提案はありますか?その「マップ」タイプをxmlパーサーに認識させるにはどうすればよいですか?

4

2 に答える 2

3

まず、SOAPUI をダウンロードし、wsdl、リクエスト、およびレスポンスを検証します。彼らの側に何か問題がある場合は、Web サービスを自分で検証して修正するように伝えてください (素人の集まりです!)。Web サービスが WS-I Basic Profile に準拠していない場合は、時間を無駄にしないでください。


それでも修正できない場合は、次の手順で正しい方向に進むことができます。

xml と soap の応答をデシリアライズしているときに同様の例外が発生しましたが、多くの詳細を提供していないため、特定の実装についてはよくわかりません。したがって、これはあなたにとって役立つかもしれませんし、まったく役に立たないかもしれません :/.

私の問題は、継承された型である xml 内のオブジェクトが原因でした。どうやら XmlSerializer は、追加の指示がなければそれに対処できません。

例 (C#):

私のxmlには、タイプのオブジェクトとFunction、関数から継承するいくつかのタイプが含まれていました。このため、XMLSerializer を作成するための通常の構文は機能しません。

XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject);

どうやら、シリアライザーには次のような追加の指示が必要なようです。

XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject), new Type[] {typeof(Function.InheritedType1), typeof(Function.InheritedType2), typeof(Function.InheritedType3), typeof(Function.InheritedType4) });

InheritedType継承されたオブジェクトの型はどこにありますか。

それが誰かに役立つことを願っています、頑張ってください:)。

于 2012-04-25T17:33:02.530 に答える
0

ここでいくつかの問題が発生する可能性があります。1つはおそらく次のとおりです。

<bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">

石鹸メッセージで。パーサーは、「bevoegdheid」要素の WSDL タイプ属性定義と SOAP メッセージ内の要素の xsi:type 値との間に大文字と小文字の不一致があるという事実を好まない場合があります。この問題により、表示されている実際の (やや誤解を招く) 例外が発生する可能性があります。どちらのコンポーネントも制御できないため、そのような問題を修正する方法がわかりません。

例外メッセージは、「ns1:Map[2]」の arrayType 値が ns1 名前空間の有効な要素名ではないことを示しています。その名前空間は、「http://xml.apache.org/xml-soap」の XSD で定義する必要がありますが、そうではないようです。残念ながら、根本的な問題は、サービスの WSDL と一致していないように見える SOAP メッセージをサービスが生成している可能性があります。幸運を!

于 2010-07-20T17:53:08.627 に答える