2010-07-28 154 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