2010-07-24 1 views
1

Это так же странно, как и получается. Имя, указанное в ElementName атрибута XmlArray, появляется в WISDL, но не в реальном ответе. Работает под 3.5 (2.0.50727 для IIS AppPool).ASP.NET WebService игнорирование возврата: XmlArray ElementName

После более подробного копания - авторизованный WSDL имеет разные объявления для ответов POST/GET vs SOAP, а diff заключается в том, что они просто ссылаются на autogenned elem/type для массива, а не на весь тип ответа/elem, который имеет новое имя.

Вопрос все еще remians - ПОЧЕМУ это происходит и что еще важнее, как его исправить?

Вот подробности:

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> 

Auto-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

Вы пробовали обновить веб-ссылку в ваш проект asp.net?

+0

Там нет веб-ссылки участвует - код сервера получает строить и хсору развернуты - 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

1

Я боюсь, что мне придется закрыть это как ошибку в ASP.NET, так как у меня есть последовательный репрограмм, и никто не сказал, что он работал со своими установками. Будете держать его на несколько дней, на всякий случай.

+0

, если вы считаете его ошибкой, то, пожалуйста, напишите его по адресу http : //connect.microsoft.com/visualstudio/. Скорее всего, это будет ошибка в XML-сериализаторе, но в этом случае он, скорее всего, никогда не будет исправлен. –

+0

Часть этого может быть связана с вопросом о различной обработке обслуживания HttpGet - обратите внимание, что атрибут находится в веб-методе, а не в классе, - атрибут привязан к записи веб-метода в таблицах отражения, поэтому XmlSerializer даже не видит это если что-то над ним или после того, как оно указывает пальцем так сказать. Я знаю, что часть coz ', где наш пользовательский двоичный сериализатор находит свои лакомства :-) Так что, вероятно, это связано с тем, что проблема обработки запроса GET обрабатывается по-разному.Нет VS в поле зрения - только CLR. – ZXX

0

Я знаю, что этот вопрос был задан вопрос некоторое время тому назад, но она по-прежнему идет вверх Google, и я боролся с той же проблемой, немного сегодня, так я думал, что это может помочь кому-то еще ...

Причина это потому, что данный элемент является является корневым узлом на выходе ... чтобы заставить его работать, как ожидалось, WebMethod должен быть определен как:

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