简体   繁体   中英

Consuming PHP webservice(SOAP, WSDL) from ASP.NET C# app - problems with array

I have a web service, defined(WSDL) and implemented in PHP. This one is relatively simple, important bits defined as the following:

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

Note that data parameter is an array, in fact it is an associative array. PHP client works beautifully with this, calling service and getting proper response.

Now, when I try to consume this service with ASP.NET... what do I use as an associative array? Hashtable?.. Proxy class created by Visual Studio says that second parameter is actually a string(or should be string) and not any type of collection...

Quite puzzling...

Addendum: I tried grabbing SOAP request that PHP generates, here is a part of it that carries 'data' parameter:

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

... So what data type that ns2:Map is? Is there something that ASP.NET supports that maps onto it cleanly?

I ran into the same problem. I'd created a web service in PHP and tried to consume it with ASP.NET. Making an associative array that ASP.NET could understand turned out to be tough. In the end, we decided to forgo the associative array in favor of an object.

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

The elements of the object are public properties. Some might even argue that an object like this is just as good as a hashtable. Good luck.

Hashtable would be the most exact approximation of a PHP associative array... However, the best comparison for 'normal' use of an associative array would be a Dictionary<string, object> or perhaps even Dictionary<string, string> (depending on what your data actually is).

A Hashtable would fit that map nicely.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM