2

C# Web サービス クライアントを使用して ASP.NET 2.0 Web サービスを呼び出すと、奇妙な問題が発生しました。このサービスは単純な製品検索であり、検索語に一致する製品の配列を返します。以下の WSDL ファイルの関連部分を参照してください。
私の C# クライアントは、VS2010 (非 WCF) で Web 参照を追加することによって単純に生成されます。比較のために、Axis 1.4 Java クライアントを使用しています。
C# クライアントと Java クライアントの両方で同じ検索パラメーターを使用すると、呼び出しによって 50 個の製品が返されますが、C# クライアントでは結果配列の長さが 1 であるのに対し、Java クライアントでは正しい 50 個の要素が表示されます。

問題を特定する方法の提案を探しています-次のことを試しました:

  • TCP/IP モニターを使用して、Web サービスから返された XML を比較します。XML は C# と Java で同じように見え、50 個の製品が含まれています。
  • netcat を使用して HTTP パラメーターを比較します。C# のデフォルトは HTTP 1.1 ですが、Axis 1.4 は HTTP 1.0 を使用しますが、C# クライアントを変更して HTTP 1.0 を使用しても何も変わりません。
  • SOAP 1.1 の代わりに SOAP 1.2 を試す: 効果なし
  • Soap の代わりに HttpGetProtocol、HttpPostProtocol を試す

どんな提案でも大歓迎です。


編集: 完全な WSDL と生成されたコード (Reference.cs) は次の場所にあります:
http://timmay.dk/Reference.txt
http://timmay.dk/Wsdl.txt

簡素化された WSDL 部分:

      <s:element name="Search">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SearchTerm" type="s:string" />
        <s:element minOccurs="0" maxOccurs="1" name="StartFrom" type="s:string" />
        <s:element minOccurs="0" maxOccurs="1" name="NumberToBeReturned" type="s:string" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:element name="SearchResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SearchResult" type="tns:SearchResult" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="SearchResult">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Products" type="tns:ArrayOfResponseProduct" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="ArrayOfResponseProduct">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="ResponseProduct" nillable="true" type="tns:ResponseProduct" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="ResponseProduct">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Fields" type="tns:ArrayOfResponseField" />
    </s:sequence>
    <s:attribute name="id" type="s:string" />
  </s:complexType>
4

2 に答える 2

0

犯人は戻り値の型だったことが判明 - 応答フィールド

< s:complexType name="ResponseField">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
      <s:element minOccurs="0" maxOccurs="1" name="Value">
        <s:complexType>
          <s:sequence>
            <s:element ref="s:schema" />
            <s:any />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>

これはデフォルトで System.Data.DataSet に変換されていました - これを単純な文字列に変更すると問題が解決しました。この場合、アンマーシャリングに失敗したようです。

于 2010-08-02T19:11:17.427 に答える
0

私が収集した WSDL から、maxOccursは 1 です。したがって、実際には 1 つだけを受け取る必要があるようですSearchResultArrayOfReponseProductただし、その結果自体には、無制限の数の `ResponseProduct アイテムを含むtype のオブジェクトが含まれている必要があります。深く見ていないのではないでしょうか?

変数インスペクター (Local、Auto、Immediate など) を使用してデバッガー内をチェックしようとしましたか? オブジェクトは型指定されていますか、それとも型指定されていませんか? その場合、コンテンツを表示するために最初にキャストする必要がありますか?

于 2010-07-28T08:45:19.780 に答える