调试C#Web服务客户端

时间:2010-07-28 08:35:07

标签: c# .net web-services asmx webservice-client

我使用C#webservice客户端调用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#相同,包含50个产品
  • 使用netcat比较HTTP参数: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 :(得分:0)

从WSDL我收集到maxOccurs是1.所以看起来你应该只收到一个SearchResult。但是,该结果本身应该包含ArrayOfReponseProduct类型的对象,该对象包含无限量的`ResponseProduct项。也许你看起来不够深?

您是否尝试使用变量检查器(Local,Auto,Immediate等)检查调试器内部?对象是键入的还是无类型的,在这种情况下,您可能需要先将其强制转换才能看到内容?

答案 1 :(得分: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>

这是pr默认转换为System.Data.DataSet - 将其更改为简单的字符串解决了问题。在这种情况下,似乎解组失败了。