Flex / AS3 не полностью декодирует XML WSDL для одной конкретной операции. Как же мне исправить это? - PullRequest
0 голосов
/ 16 февраля 2010

В настоящее время я использую WSDL во Flex, который находится на сервере, обслуживаемом .NET. Кажется, что все операции работают нормально, кроме одной, чей результирующий объект не был должным образом проанализирован AS3 по какой-то странной причине. Я проверил XML-ответ в Fiddler / Charles, и данные есть, но НЕ в результате - в инспекторе переменных Flex. Виновником является подтэг 'DD' (result.data.result.Tables.DD.Columns). Я вижу только одного из них, и это 17 дочерних подкатегорий, но они перечислены как индексы массива 0-17 со значениями. из "RID", "NP", "LI" и так далее. Но эти теги не имеют значений. Я думаю, что я не получаю никаких тегов <DD>.

Вот мой обработчик результата:

public function getLocationStats_result( result : Object ) : void
{
   trace("Location Stats Received");
   var locations : ArrayCollection = result.data.result.Tables.DD.Columns;

   sublocationCheck();
   for(var i: int =0; i < locations.length; i++)
   {
      //Setting up the info Dictionary, key= location name, value =  LocationInfo obj.
      model.pinLocations.sublocations.getItemAt(0).info[locations[i]]= new LocationInfo();
   } 
};  

А вот соответствующая часть ответа от WSDL:

<GetLocationStatsResponse xmlns="http://tempuri.org/">
  <GetLocationStatsResult>
    <xs:schema id="Rpt_DSDashBoardFeed" targetNamespace="http://tempuri.org/Rpt_DSDashBoardFeed.xsd" xmlns:mstns="http://tempuri.org/Rpt_DSDashBoardFeed.xsd" xmlns="http://tempuri.org/Rpt_DSDashBoardFeed.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
      <xs:element name="Rpt_DSDashBoardFeed" msdata:IsDataSet="true">
        <xs:complexType>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="DD">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="RID" type="xs:decimal" minOccurs="0" />
                  <xs:element name="LP" type="xs:long" minOccurs="0" />
                  <xs:element name="NI" type="xs:long" minOccurs="0" />
                  <xs:element name="ENC" type="xs:long" minOccurs="0" />
                  <xs:element name="IMIN" type="xs:dateTime" minOccurs="0" />
                  <xs:element name="IMAX" type="xs:dateTime" minOccurs="0" />
                  <xs:element name="CC" type="xs:string" minOccurs="0" />
                  <xs:element name="LC" type="xs:string" minOccurs="0" />
                  <xs:element name="SLC" type="xs:string" minOccurs="0" />
                  <xs:element name="PC" type="xs:string" minOccurs="0" />
                  <xs:element name="CN" type="xs:string" minOccurs="0" />
                  <xs:element name="LN" type="xs:string" minOccurs="0" />
                  <xs:element name="SLN" type="xs:string" minOccurs="0" />
                  <xs:element name="PN" type="xs:string" minOccurs="0" />
                  <xs:element name="HW" type="xs:decimal" minOccurs="0" />
                  <xs:element name="TH" type="xs:decimal" minOccurs="0" />
                  <xs:element name="TE" type="xs:decimal" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <Rpt_DSDashBoardFeed xmlns="http://tempuri.org/Rpt_DSDashBoardFeed.xsd">
        <DD diffgr:id="DD1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
          <RID>21389325</RID>
          <LP>277467563</LP>
          <NI>1</NI>
          <ENC>1</ENC>
          <IMIN>2010-02-16T09:53:54.0000000-05:00</IMIN>
          <IMAX>2010-02-16T09:53:54.0000000-05:00</IMAX>
          <CC>WDWPR</CC>
          <LC>MK</LC>
          <SLC>ENTR</SLC>
          <PC>397850</PC>
          <CN>Some String</CN>
          <LN>Another String</LN>
          <SLN>Location</SLN>
          <PN>Eastman, Suzy</PN>
          <HW>0</HW>
          <TH>11</TH>
          <TE>30</TE>
        </DD>
        <DD diffgr:id="DD2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
          <RID>21389326</RID>
          <LP>277467508</LP>
          <NI>8</NI>
          <ENC>2</ENC>
          <IMIN>2010-02-16T09:53:42.0000000-05:00</IMIN>
          <IMAX>2010-02-16T09:55:16.0000000-05:00</IMAX>
          <CC>WDWPR</CC>
          <LC>MK</LC>
          <SLC>FMAIN</SLC>
          <PC>359800</PC>
          <CN>Some String</CN>
          <LN>Yet ANOTHER string</LN>
          <SLN>Some Info</SLN>
          <PN>Mays, Willie</PN>
          <HW>0</HW>
          <TH>11</TH>
          <TE>42</TE>
        </DD>

(усечено, больше тегов DD, плюс закрывающие теги.) Все, что я вижу, - это начальный тег с именами тегов. Я не вижу в своем отладчике в объекте результата каких-либо реальных тегов DD или способа доступа к ним. Как же я могу ссылаться на них? Я сошел с ума, гуглил и искал в стеке поток ответов, и теперь я застрял. Заранее спасибо за любую помощь!

1 Ответ

1 голос
/ 16 февраля 2010

Эврика! Я понял это.

Очевидно, что Flex не может обработать объект .NET DataSet, который был сериализован в ответ WSDL. Вместо этого вы должны использовать объектные массивы на стороне .NET для Flex, чтобы иметь возможность анализировать его в свой результирующий объект во Flex.

Другой вариант - просто преобразовать DataSet в XML в .NET, который, очевидно, может быть легко прочитан Flex / AS3. Да, это невероятно отстой. Здравствуйте, Adobe?

Я взял этот ответ в блоге Эндрю Стопфорда. (Спасибо, Андрей!)

...