2010-07-24 63 views
1

這是奇怪的,因爲它得到。 XmlArray中給出的名稱attrib的ElementName出現在WISDL中,但不是實際的響應。在3.5下運行(2.0.50727 for IIS AppPool)。ASP.NET WebService忽略返回:XmlArray元素名稱

更詳細的挖掘 - 自動化的WSDL對POST/GET和SOAP響應有不同的聲明,差異在於它們只是引用自動生成的elem/type而不是整個響應類型/ elem,它具有新名稱。

問題依然存在 - 爲什麼會發生這種情況,更重要的是如何解決這個問題?

下面是詳細信息:

的WebMethod:

[WebMethod] 
    [return: XmlArray(ElementName = "TickTick")] 
    public TTickerItem[] GetActiveTickerItems2(uint version, uint language, uint locale, int startIndex, int maxItems) 

在WSDL:

<s:element name="GetActiveTickerItems2Response"> 
    <s:complexType> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="TickTick" type="tns:ArrayOfTTickerItem" /> 
    </s:sequence> 
    </s:complexType> 
</s:element> 

<wsdl:message name="GetActiveTickerItems2SoapIn"> 
    <wsdl:part name="parameters" element="tns:GetActiveTickerItems2" /> 
</wsdl:message> 
<wsdl:message name="GetActiveTickerItems2SoapOut"> 
    <wsdl:part name="parameters" element="tns:GetActiveTickerItems2Response" /> 
</wsdl:message> 

自動genned測試頁顯示新的名稱(TickTick)的例子。

實際響應:

<ArrayOfTTickerItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
<TTickerItem> 
    <m_message>New Ticker 1st Message</m_message> 
    <m_priority>2</m_priority> 
    <m_messageType>0</m_messageType> 
    <m_data1>0</m_data1> 
    <m_data2>13</m_data2> 
</TTickerItem> 
. . . . . . . . 
</ArrayOfTTickerItem> 

略有不同GET/POST聲明 - 錯過了新的名字:

<wsdl:message name="GetActiveTickerItems2HttpGetOut"> 
    <wsdl:part name="Body" element="tns:ArrayOfTTickerItem" /> 
</wsdl:message> 
. . . . . . . 
<wsdl:message name="GetActiveTickerItems2HttpPostOut"> 
    <wsdl:part name="Body" element="tns:ArrayOfTTickerItem" /> 
</wsdl:message> 

它仍然是某些設置的事情,web.config中的一部分(我只是簡單地添加名稱=「HttpGet」和HttpPost在//system.web/webServices/protocols xpath這一直足以)...

回答

0

您是否嘗試過更新Web引用你的asp.net項目?

+0

沒有涉及web引用 - 服務器代碼獲取構建和部署xcopy - VS沒有得到關於它的任何信息,測試頁面是由ASP.net自動生成的,如http://localhost/MyVroot/MyWS.asmx,http://localhost/MyVroot/MyWS.a smx?WSDL,http://MyBox/MyVroot/MyWS.asmx?op = GetActiveTickerItems2等等等等,所以我正在查看實際響應XML在IE – ZXX 2010-07-25 02:01:07

1

恐怕我不得不把這個作爲ASP.NET中的一個bug來關閉,因爲我有一致的repro,並且沒有人說它可以和他們的設置一起工作。以防萬一,以防萬一。

+0

如果你認爲它是一個bug,那麼請在http ://connect.microsoft.com/visualstudio/。這很可能是XML序列化程序中的一個錯誤,但是,在這種情況下,它很可能永遠不會被修復。 – 2010-08-14 04:26:10

+0

這可能與HttpGet服務的不同處理問題有關 - 請注意attrib屬於web方法而不是類 - attrib被附加到反射表中的web方法記錄,所以XmlSerializer甚至不會看到除非它上面有東西,或者它指着可以說話之後。我知道這一部分是因爲我們的自定義二進制序列化程序發現他的好東西:-) 所以它可能會回到GET請求的處理方式不同。沒有VS在望 - 只是CLR。 – ZXX 2010-08-14 05:00:10

0

我知道這個問題前一段時間有人問,但現在它仍然出現谷歌和我一直在努力用今天的小,所以我想這可能幫助別人同樣的問題...

原因這是因爲所討論的元素是輸出中的根節點...使其按預期工作,webmethod應定義爲:

[WebMethod] 
[return: XmlArray(ElementName = "TickTick"),XmlRoot(ElementName = "TickTick")] 
public TTickerItem[] GetActiveTickerItems2(uint version, uint language, uint locale, int startIndex, int maxItems)