Rudgar: SOAP-Webservice (IIS) mit PHP (Apache) aber ohne(!) WSDL nutzen

Beitrag lesen

Ahoy!

Ich kämpfe mit einem vielleicht akademisch anmutenden Problem, wüßte aber  trotzdem gerne eine Lösung und komme einfach nicht weiter.

Situtation:

  • ein Server, auf dem ein IIS als Webserver "schnarchhahn" läuft.
  • auf diesem Rechner eine DLL, die über das SOAP-Toolkit als Webservice verfügbar gemacht wurde.
  • Zu diesem Webservice gibt es eine WSDL (s.u.)
  • ein zweiter Server mit Apache als Webserver "obelix" läuft.
  • ein PHP-Skriptauf "obelix", das den Webservice auf "schnarchhahn" über SOAP nutzen soll.

Das klappt soweit problemlos, wenn ich die WSDL (s.u.) nutze:

<?php  
$client = new SoapClient( 'http://schnarchhahn/SoapServices/Try/wsTry.wsdl', array('exceptions' => 0, 'cache_wsdl'=>WSDL_CACHE_NONE) );  
$result = $client->ReturnLong($_POST['var0'])  
?>

Und nun der Haken an der Sache: obwohl es eine WSDL-Datei gibt, soll der Service auch direkt und ohne Verwendung der WSDL-Datei genutzt werden können. Mein bisheriger Versuch fliegt auf die Schnauze:

<?php  
  $client = new SoapClient( NULL,  
                            array (  
                                  "location"  => $strAdr['asp'],  
                                  "uri"       => "http://schnarchhahn/SoapServices/Try/message/",  
                                  "style"     => SOAP_RPC,  
                                  "use"       => SOAP_ENCODED,  
                                  'exceptions' => 0  
                                  )  
                          );  
  $parameters = array (  
                        new SoapParam($_POST['var0'], 'pi_lLong')  
                      );  
  $result = $client->__call ( "ReturnLong",  
                              array("parameters" => $parameters),  
                              array (  
                                    "uri" => "http://schnarchhahn/SoapServices/Try/message/",  
                                    "soapaction" => "http://schnarchhahn/SoapServices/Try/action/clsWS.Init"  
                                    )  
                            );  
?>

Antwort des SOAP-Servers auf "schnarchhahn":

"WSDLReader:None of the matching operations for soapAction http://schnarchhahn/SoapServices/Try/action/clsWS.Init could successfully load the incoming request. Potential typemapper problem"

Wo vergesse/übersehe ich was?
Oder wo hakt es bei mir am generellen Verständnis?
Mir ist nämlich auch irgendwie nicht so ganz klar, was diese Option-Arrays beim Erzeugen des Clients und beim Call selbst so alles zu sagen haben :(

Kann / mag mir bitte jemand einen Tipp geben?
Herzlichen Dank im Voraus!

Hier der Vollständigkeit halber die WSDL-Datei:

<!-- Generated 12/10/08 by Microsoft SOAP Toolkit WSDL File Generator, Version 3.00.1325.0 -->  
<definitions  
 name='wsTry'  
 targetNamespace='http://schnarchhahn/SoapServices/Try/wsdl/'  
 xmlns:wsdlns='http://schnarchhahn/SoapServices/Try/wsdl/'  
 xmlns:typens='http://schnarchhahn/SoapServices/Try/type/'  
 xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'  
 xmlns:xsd='http://www.w3.org/2001/XMLSchema'  
 xmlns:stk='http://schemas.microsoft.com/soap-toolkit/wsdl-extension'  
 xmlns:dime='http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/'  
 xmlns:ref='http://schemas.xmlsoap.org/ws/2002/04/reference/'  
 xmlns:content='http://schemas.xmlsoap.org/ws/2002/04/content-type/'  
 xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'  
 xmlns='http://schemas.xmlsoap.org/wsdl/'>  
 <types>  
  <schema  
   targetNamespace='http://schnarchhahn/SoapServices/Try/type/'  
   xmlns='http://www.w3.org/2001/XMLSchema'  
   xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'  
   xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'  
   elementFormDefault='qualified'>  
   <import namespace='http://schemas.xmlsoap.org/soap/encoding/'/>  
   <import namespace='http://schemas.xmlsoap.org/wsdl/'/>  
   <import namespace='http://schemas.xmlsoap.org/ws/2002/04/reference/'/>  
   <import namespace='http://schemas.xmlsoap.org/ws/2002/04/content-type/'/>  
  </schema>  
 </types>  
 <message name='clsWS.ReturnLong'>  
  <part name='pi_lLong' type='xsd:int'/>  
 </message>  
 <message name='clsWS.ReturnLongResponse'>  
  <part name='Result' type='xsd:int'/>  
 </message>  
 <portType name='clsWSSoapPort'>  
  <operation name='ReturnLong' parameterOrder='pi_lLong'>  
   <input message='wsdlns:clsWS.ReturnLong'/>  
   <output message='wsdlns:clsWS.ReturnLongResponse'/>  
  </operation>  
 </portType>  
 <binding name='clsWSSoapBinding' type='wsdlns:clsWSSoapPort' >  
  <stk:binding preferredEncoding='UTF-8'/>  
  <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>  
  <operation name='ReturnLong'>  
   <soap:operation soapAction='http://schnarchhahn/SoapServices/Try/action/clsWS.ReturnLong'/>  
   <input>  
    <soap:body  
     use='encoded'  
     namespace='http://schnarchhahn/SoapServices/Try/message/'  
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'  
     parts='pi_lLong'/>  
   </input>  
   <output>  
    <soap:body  
     use='encoded'  
     namespace='http://schnarchhahn/SoapServices/Try/message/'  
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'  
     parts='Result'/>  
   </output>  
  </operation>  
 </binding>  
 <service name='wsTry' >  
  <port name='clsWSSoapPort' binding='wsdlns:clsWSSoapBinding' >  
   <soap:address location='http://schnarchhahn/SoapServices/Try/wsTry.ASP'/>  
  </port>  
 </service>  
</definitions>

Gruß, Ich