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

У меня есть веб-сервис, определенный (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, что четко отображается на нем?


person Alex N.    schedule 09.07.2009    source источник


Ответы (2)


Я столкнулся с той же проблемой. Я создал веб-службу на 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>

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

person Nick R.    schedule 12.07.2009
comment
Ага! Мне пришлось сделать то же самое :)) Фактически, только что закончил собирать его пару дней назад, похоже, это единственное работоспособное решение. Я думаю, причина в том, что стандарт W3C XML Schema не содержит ассоциативный массив как тип данных. - person Alex N.; 14.07.2009

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

Hashtable отлично подошел бы к этой карте.

person Matthew Scharley    schedule 09.07.2009
comment
вот в чем дело ... он не работает с Hashtable :( когда я вызываю веб-сервис из ASP.NET с параметром Hashtable, он даже не компилируется, что дает мне 2 ошибки: Ошибка 84 Лучшее совпадение перегруженного метода для 'my.registration .RemoteRegistrationService.registerAccount (string, string) 'имеет некоторые недопустимые аргументы и Error 85 Argument' 2 ': невозможно преобразовать из' System.Collections.Hashtable 'в' string '; ( - person Alex N.; 09.07.2009
comment
Я признаю, что раньше не использовал SOAP ... если это автоматически сгенерированный метод, тогда я действительно не знаю, что вы можете сделать ... Я просто говорю из того, что я знаю, и это то, что Hashtable является наилучшим приближением как ассоциативного массива PHP, так и, насколько я могу судить, типа ns2: Map. - person Matthew Scharley; 09.07.2009