2010-07-28 121 views
2

我遇到了一个奇怪的问题,使用C#web服务客户端调用ASP.NET 2.0 web服务。 该服务是一种简单的产品搜索,并返回与搜索项匹配的产品数组 - 请参阅下面的WSDL文件的相关部分。
我的C#客户端只是通过在VS2010(非WCF)中添加Web引用而生成的,为了进行比较,我使用了Axis 1.4 Java客户端。
在C#和Java客户端中使用相同的搜索参数,调用会返回50个产品,但在C#客户端中,结果数组的长度为1,而Java客户端显示正确的50个元素。调试C#web服务客户端

我要找的建议如何定位的问题 - 我已经试过如下:

  • 比较使用TCP/IP监控由Web服务返回的XML:中的XML看起来与C#与Java的并包含50个产品
  • 使用netcat的比较HTTP参数:C#默认为HTTP 1.1,而轴1.4使用HTTP 1.0,但改变C#客户端使用HTTP 1.0,以及确实没有改变任何东西
  • 尝试SOAP 1.2,而不是SOAP的1.1:没有效果
  • 试试HttpGetPr协议,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> 
+0

C#客户端如何仅用1个数组元素返回50个产品? – 2010-07-28 08:48:19

+0

数组*应该*长度为50,但长度为1.通过查看TCP/IP监视器中的XML,我可以看到服务返回的所有50个产品 - 解析的结果是问题。 – Tim 2010-07-28 08:59:51

+0

既然明显的答案不能帮到你,我们需要看看你生成的代码,甚至是一个包含bug的小型完整工作示例(但在这种情况下可能会很难)。 – Abel 2010-07-28 10:18:59

回答

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中 - 改变这一个简单的字符串解决了这个问题。在这种情况下,解组似乎失败了。

0

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

您是否试图用变量检查器(Local,Auto,Immediate等)检查调试器内部?是输入对象还是无类型对象,在这种情况下,您可能需要首先将其转换为查看内容?

+0

这是正确的 - 您会收到1个SearchResult对象,并且该对象具有ArrayOfResponseProduct(生成的代码中的SearchResult.Producst)。 这个代码的长度为1,C#代码和Java代码中的长度为50。 与提示数组的Length属性一样,调试器显示1项。 – Tim 2010-07-28 08:57:45

+0

@Tim:我可以假设你已经检查过一个项目不是数组或枚举器的另一个级别,正如你的WSDL所建议的那样? – Abel 2010-07-28 10:18:13

+0

是的,那个项目只是一个“ResponseProduct”,它由一组属性组成。该XML看起来是这样的: ... - 每个ResponseProduct项目具有字段列表。 我收到的Products数组中的单个条目具有“id”1330601,就像它应该根据XML一样。 调试Java客户端会产生相同的结构,只需在Products数组中有50个项目。 – Tim 2010-07-28 11:24:22