Отладка клиента веб-сервиса на C # - PullRequest
2 голосов
/ 28 июля 2010

Я столкнулся со странной проблемой при использовании клиента веб-службы C # для вызова веб-службы ASP.NET 2.0. Служба представляет собой простой поиск товаров и возвращает массив товаров, соответствующих поисковому запросу - см. Соответствующую часть файла WSDL ниже.
Мой клиент C # просто создается путем добавления веб-ссылки в VS2010 (не WCF), и для сравнения я использую Java-клиент Axis 1.4.
Используя одинаковые параметры поиска как в C #, так и в клиенте Java, вызов возвращает 50 продуктов, но в клиенте C # массив результатов имеет длину 1, а клиент Java показывает правильные 50 элементов.

Я ищу предложения, как найти проблему - я пробовал следующее:

  • Сравните XML, возвращенный веб-сервисом с помощью монитора TCP / IP: XML выглядит идентично C # и Java и содержит 50 продуктов
  • Сравнение параметров HTTP с использованием netcat: C # по умолчанию использует HTTP 1.1, а Axis 1.4 использует HTTP 1.0, но изменение клиента C # на использование HTTP 1.0 также ничего не меняет
  • Попробуйте SOAP 1.2 вместо SOAP 1.1: без эффекта
  • Попробуйте HttpGetProtocol, HttpPostProtocol вместо Soap

Любые предложения высоко ценятся.


РЕДАКТИРОВАТЬ: Полный 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>

Ответы [ 2 ]

0 голосов
/ 02 августа 2010

Оказалось, что виновником был тип возвращаемых значений - Поле ответа

< 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 - изменение его на простую строку решило проблему,Похоже, что в этом случае распаковка не удалась.

0 голосов
/ 28 июля 2010

Из WSDL я понимаю, что maxOccurs равен 1. Так что, похоже, вы действительно должны получить только один SearchResult.Однако сам этот результат должен содержать объект типа ArrayOfReponseProduct, который содержит неограниченное количество элементов ResponseProduct.Может быть, вы не смотрите достаточно глубоко?

Вы пытались проверить в отладчике с помощью переменных инспекторов (Local, Auto, Immediate и т. Д.)?Является ли объект типизированным или нетипизированным, и в этом случае вам может понадобиться сначала привести его в действие, чтобы увидеть содержимое?

...