views:

2874

answers:

2

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?

+1  A: 

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.

Matthew Scharley
that's the thing... it doesn't work with Hashtable :(when I call webservice from ASP.NET with Hashtable parameter it doesn't even compile, giving me 2 errors:Error 84 The best overloaded method match for 'my.registration.RemoteRegistrationService.registerAccount(string, string)' has some invalid argumentsandError 85 Argument '2': cannot convert from 'System.Collections.Hashtable' to 'string' ;(
Alex N.
I'll admit to having not used SOAP before... if that's an autogenerated method, then I really don't know what you can do... I'm just speaking from what I do know, and that is that a Hashtable is the best approximation of both a PHP associative array, and from what I can see, the ns2:Map type.
Matthew Scharley
+1  A: 

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"&gt;



    <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/"&gt;


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

Nick R.
yep! I had to do exactly the same :)) in fact just finished putting it together couple of days ago, appears to be only workable solution. I think the reason behind it is that W3C XML Schema standard does not contain associative array as a data type.
Alex N.