[NuSoap] WCF webservice benaderen met NuSoap (PHP)

Pagina: 1
Acties:
  • 1.324 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 23:04
Hoi,

Ik probeer op dit moment om een WCF service vanuit een PHP pagina te benaderen met de NuSoap library.

Ik kan de webservice wel aanroepen maar ik krijg een verkeerd resultaat terug. Ik heb een methode (KlantBestaat) die een boolean teruggeeft. Vanuit een Windows applicatie met een refrence daarheen krijg ik netjes de waarde TRUE terug als ik een bestaande klant opgeef. Als ik dezelfde call vanuit PHP uitvoer krijg ik false terug. Ik heb nog niet kunnen vinden waar het probleem nu zit.

Zie hier voor de uitvoer van de trace bestanden van beide aanroepen. Hopenlijk ziet iemand van jullie wat er aan de hand is. Ik heb kan het maar niet uit die log halen.

www.ordelman.org/temp/messages_windows2.svclog
www.ordelman.org/temp/messages_php.svclog

Het valt me wel op dat de PHP kant een GET operatie doet en de Windows client een POST. Met SvcTraceViewer zie ik in het parameters ook niet staan bij de PHP verzoek en bij de andere zie ik netjes welke paramaters er binnen gekomen zijn.

Hierbij de config van de WCF Service:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<services>
        <service name="vlaggen.KlantenWindowsService.KlantenService" behaviorConfiguration="KlantenWindows_Behavior">
        <!--<service name="vlaggen.KlantenWindowsService.KlantenService" behaviorConfiguration="Secure_KlantenWindows_Behavior">-->
        <host>
          <baseAddresses>            
            <add baseAddress="http://localhost:8000/KlantenService"/>
          </baseAddresses>
        </host>
        <!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/CalculatorService  -->
       <endpoint address=""
          binding="basicHttpBinding"
          name="BasicEndpoint"
          contract="vlaggen.KlantenWindowsService.IKlantenService"/>
        <!-- the mex endpoint is explosed at http://localhost:8000/CalculatorService/mex -->
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange"/>       
      </service>   
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="KlantenWindows_Behavior">          
          <serviceMetadata httpGetEnabled="true" />
          <!-- Met deze instelling kun je aangeven dat debug exceptions teruggegeven worden aan de client. Zet deze alleen op true bij ontwikkelen en debuggen -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior> 
      </serviceBehaviors>      
    </behaviors>


De php code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php  

require_once('./lib/nusoap.php'); 
$wsdl="http://localhost:8000/KlantenService?wsdl";
$client=new soapclient($wsdl, "wsdl");

// get the SOAP proxy object, which allows you to call the methods directly
$proxy = $client->getProxy(); 

$paramKlantBestaat=array();
$paramKlantBestaat->klantnaam = (string)"test45";
$paramKlantBestaat->adres = (string)"Industrieweg 90";
$paramKlantBestaat->postcode = (string)"5405 NP";

// get the result, a native PHP type, such as an array or string
$result = $proxy->KlantBestaat($paramKlantBestaat);
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
        // Display the error
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result
        echo '<h2>Result</h2><pre>';
        print_r($result);
        echo '</pre>';
    }
}

?>



EDIT:
Net een extra methode gemaakt die een string als parameter heeft en een string retouneert. Die string is een vaste rekst plus de parameter. Als ik de methode aanroep via NuSoap krijg ik alleen het constante deel terug. Blijkbaar komen de parameters dus gewoon niet door.

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Je gebruikt een array als een object, probeer van $paramKlantBestaat->x even $paramKlantBestaat['x'] te maken ;)

[ Voor 5% gewijzigd door Patriot op 24-01-2008 23:07 ]


Acties:
  • 0 Henk 'm!

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 23:04
Patriot schreef op donderdag 24 januari 2008 @ 23:06:
Je gebruikt een array als een object, probeer van $paramKlantBestaat->x even $paramKlantBestaat['x'] te maken ;)
Wow thanks, dat was wel heel erg dom me.

Op mijn lokale webserver doet de aanroep naar de service het nu. Helaas op de webserver waar het op moet komen krijg ik een foutmelding.
code:
1
2
3
Warning: __construct() expects parameter 2 to be array, boolean given in /usr/local/psa/home/vhosts/groenwit.nl/subdomains/gw12/httpdocs/test2/CallWebservice.php on line 6

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Client] SoapClient::__construct() [function.--construct]: Invalid parameters in


Wat ik op internet kon vinden (was niet veel) kon het te maken hebben dat daar de soap library van PHP zelf aan staat. Dat klopt ook wel als ik de phpinfo opvraag. Nu heb ik denk ik een probleem omdat dat (Php.ini) volgens mij niet te wijzigen is per klant / website. Dat is toch hostingserver breed de instelling.

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
GAEvakYD schreef op vrijdag 25 januari 2008 @ 10:07:
[...]


Wow thanks, dat was wel heel erg dom me.

Op mijn lokale webserver doet de aanroep naar de service het nu. Helaas op de webserver waar het op moet komen krijg ik een foutmelding.
code:
1
2
3
Warning: __construct() expects parameter 2 to be array, boolean given in /usr/local/psa/home/vhosts/groenwit.nl/subdomains/gw12/httpdocs/test2/CallWebservice.php on line 6

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Client] SoapClient::__construct() [function.--construct]: Invalid parameters in


Wat ik op internet kon vinden (was niet veel) kon het te maken hebben dat daar de soap library van PHP zelf aan staat. Dat klopt ook wel als ik de phpinfo opvraag. Nu heb ik denk ik een probleem omdat dat (Php.ini) volgens mij niet te wijzigen is per klant / website. Dat is toch hostingserver breed de instelling.
Het maakt niet uit of de library van php aanstaat, je kunt gewoon nusoap blijven gebruiken! SoapClient is wel van PHP, misschien roep je de verkeerde aan!

Je roept een class aan, maar het tweede argument wat je meegeeft is geen array!

[ Voor 3% gewijzigd door steffex op 25-01-2008 10:21 ]


Acties:
  • 0 Henk 'm!

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 23:04
Hoe kan het dan dat precies dezelfde file het op 2 hosts wel doet en op 1 niet. Het enige verschil is in de hosting, dat de SOAP library aanstaat.

Zie hier iemand met hetzelfde probleem:
http://lists.netfielders....sh/2006-April/023931.html
http://lists.netfielders....sh/2006-April/023969.html


De API van die methode heeft ook gewoon 2 parameters waarvan de tweede een boolean moet zijn en geen array. Dit is de code die ik executeer en waar de melding op komt:
code:
1
2
3
4
5
6
<?php  

require_once('./lib/nusoap.php'); 
$wsdl="http://localhost:8001/KlantenService?wsdl";

$client=new soapclient($wsdl, true);


Zie hier de API doc:
http://dietrich.ganx4.com...ml#functions_soapclient()

Die melding moet dus wel door die SOAP komen toch? Ik zie hier een duitser die volgens mij in het laatste bericht zegt dat hij de soapclient class hernoemt heeft en daar het probleem mee heeft opgelost
http://www.phpforum.de/forum/showthread.php?t=214134

Ik ga dat vanavond eens testen, ik zit nu op mijn werk en kan vanaf hier de webservice niet vanaf extern benaderen. Lokaal blijft alles het gewoon doen dus blijkbaar moet die soapclient class deprecated worden want dit is echt heel verwarrend en heb ik nergens in de help gevonden.

EDIT:
Nu is er nog een probleem op een andere hosting. Als ik daar het script aanroep krijg ik direct de melding zonder dat die ook maar verbinding heeft kunnen maken.
code:
1
wsdl error: HTTP ERROR: Couldn't open socket connection to server http://ruald.dyndns.org:8001/KlantenService?wsdl, Error (111): Connection refused


Als ik hetzelfde script aanroep op de andere (externe) hosts krijg ik op den duur een timeout, wat ook logisch is omdat hij mijn laptop niet kan benaderen. Die andere host komt volgens mij helemaal niet weg vanaf de server. Verschil van deze server is dat deze Php4 is en de rest Php5.
Zie hier het script en de melding:
http://www.vlaggen.nl/poc/Call.php

[ Voor 42% gewijzigd door GAEvakYD op 06-02-2008 14:47 ]

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.