Skip to main content
 首页 » 编程设计

c#之调试 C# web 服务客户端

2024年01月12日29飞鱼

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

我正在寻找如何定位问题的建议 - 我已经尝试了以下方法:

  • 使用 TCP/IP 监视器比较网络服务返回的 XML:XML 看起来与 C# 和 Java 相同,并且包含 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> 

请您参考如下方法:

从 WSDL 中我收集到 maxOccurs 是 1。因此看起来您应该确实只收到一个 SearchResult。但是,该结果本身应该包含 ArrayOfReponseProduct 类型的对象,其中包含无限量的“ResponseProduct”项。也许你看得不够深入?

您是否尝试过使用变量检查器(本地、自动、立即等)检查调试器内部?对象是类型化的还是非类型化的,在哪种情况下您可能需要先转换它才能看到内容?