Использование веб-службы PHP (SOAP, WSDL) из приложения ASP.NET C # - проблемы с массивом - PullRequest
4 голосов
/ 09 июля 2009

У меня есть веб-сервис, определенный (WSDL) и реализованный на PHP. Это относительно простые, важные биты, определенные следующим образом:

<message name='registerAccountRequest'>
        <part name='key' type='xsd:string'/> <!-- key -->
        <part name='data' type='xsd:array'/> <!-- account data -->
</message>
<message name='registerAccountResponse'>
        <part name='success' type='xsd:string' />
</message>

Обратите внимание, что параметр данных является массивом, фактически это ассоциативный массив. PHP-клиент прекрасно работает с этим, вызывая службу и получая правильный ответ.

Теперь, когда я пытаюсь использовать этот сервис в ASP.NET ... что я могу использовать в качестве ассоциативного массива? Hashtable? .. Прокси-класс, созданный Visual Studio, говорит, что второй параметр на самом деле является строкой (или должен быть строкой), а не каким-либо типом коллекции ...

Довольно загадочно ...

Добавление: Я пытался получить SOAP-запрос, который генерирует PHP, вот его часть, которая содержит параметр «data»:

...<data xsi:type="ns2:Map">
     <item>
       <key xsi:type="xsd:string">company_data</key>
       <value xsi:type="ns2:Map">
         <item>
           <key xsi:type="xsd:string">name</key>
           <value xsi:type="xsd:string">Test company name</value>
         </item>
         <item>
           <key xsi:type="xsd:string">slogan</key>
           <value xsi:type="xsd:string">Test company slogan</value>
         </item>

... Так что же это за тип данных ns2: Map? Есть ли что-то, что ASP.NET поддерживает, чтобы отобразить на него чисто?

Ответы [ 2 ]

2 голосов
/ 12 июля 2009

Я столкнулся с той же проблемой. Я создал веб-сервис на PHP и попытался использовать его с ASP.NET. Создание ассоциативного массива, понятного ASP.NET, оказалось непростым делом. В конце концов мы решили отказаться от ассоциативного массива в пользу объекта.

    <definitions
       ...
       xmlns:myNameSpace="http://myServer.com/mySoapService/files/schema">



    <types>
      <schema xmlns="http://www.w3.org/2001/XMLSchema"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
          targetNamespace="http://myServer.com/mySoapService/files/schema"
          xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">


      <complexType name="ViewCustomer_Object">
        <sequence>
            <element minOccurs="0" name="customer" type="string" />
            <element minOccurs="0" name="password" type="string" />
            <element minOccurs="0" name="first_name" type="string" />
        </sequence>
      </complexType>
    </schema>
  </types> 

   ...

    <message name="view_customer_response">
        <part name="return" type="myNameSpace:ViewCustomer_Object" />
    </message>



    ...

    </definitions>

Элементы объекта являются общедоступными свойствами. Некоторые могут даже утверждать, что подобный объект так же хорош, как хеш-таблица. Удачи.

1 голос
/ 09 июля 2009

Hashtable было бы наиболее точным приближением ассоциативного массива PHP ... Однако лучшее сравнение для «нормального» использования ассоциативного массива было бы Dictionary<string, object> или, возможно, даже Dictionary<string, string> (в зависимости от ваши данные на самом деле).

A Hashtable будет хорошо соответствовать этой карте.

...