[PHP/Soap] Response probleem

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
Al een dikke twee week zit ik mijn vingers stuk te bijten op het volgende:

Voor een management systeem worden twee servers gebruikt. De communicatie tussen beide servers verloopt via SOAP. Hiervoor gebruik ik het script NuSoap.

Het probleem zit hem in het feit dat de communicatie niet goed verloopt. De request word verzonden en ontvangen op de andere server. Maar de response komt niet terug!

We zijn al met ons hostingbedrijf aan de slag geweest om dit probleem te tackelen, maar helaas komen we er nog niet uit. Dus nu schakel ik jullie hulp in of jullie misschien enig idee hebben.
De firewalls staan allemaal vol open tussen biede servers.

Wie kan mij helpen?

Hieronder het debug log van NuSoap als de fout ontstaat:
Request:
code:
1
POST /index.php HTTP/1.0 Host: eenadres.nl Authorization: Basic YWRtaW46ZHV0Y2gxMnZpZXc= User-Agent: NuSOAP/0.7.2 (1.94) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "" Content-Length: 561 <?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns7703:getHeaderAssets xmlns:ns7703="http://tempuri.org"><directory xsi:type="xsd:string">internebestanden-20070219-1172823400</directory></ns7703:getHeaderAssets></SOAP-ENV:Body></SOAP-ENV:Envelope>


Response
code:
1


Debug log
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2007-03-02 09:17:38.266421 soapclient: instantiate SOAP with endpoint at http://admin:dutch12view@staging.encoding.dutchview.nl/xfr/index.php
2007-03-02 09:17:38.266535 soapclient: call: operation=getHeaderAssets, namespace=http://tempuri.org, soapAction=, rpcParams=, style=rpc, use=encoded, endpointType=soap
params=array(1) {
  ["directory"]=>
  string(36) "internebestanden-20070219-1172823400"
}
headers=bool(false)
2007-03-02 09:17:38.266673 soapclient: serializing param array for operation getHeaderAssets
2007-03-02 09:17:38.266773 soapclient: in serialize_val: name=directory, type=, name_ns=, type_ns=, use=encoded
value=string(36) "internebestanden-20070219-1172823400"
attributes=bool(false)
2007-03-02 09:17:38.266914 soapclient: wrapping RPC request with encoded method element
2007-03-02 09:17:38.267019 soapclient: In serializeEnvelope length=164 body (max 1000 characters)=internebestanden-20070219-1172823400 style=rpc use=encoded encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
2007-03-02 09:17:38.267105 soapclient: headers:
bool(false)
2007-03-02 09:17:38.267198 soapclient: namespaces:
array(0) {
}
2007-03-02 09:17:38.267325 soapclient: endpoint=http://eenadres.nl/index.php, soapAction=, namespace=http://tempuri.org, style=rpc, use=encoded, encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
2007-03-02 09:17:38.267418 soapclient: SOAP message length=561 contents (max 1000 bytes)=internebestanden-20070219-1172823400
2007-03-02 09:17:38.267520 soapclient: transporting via HTTP
2007-03-02 09:17:38.268687 soapclient: sending message, length=561
2007-03-02 09:17:38.267665 soap_transport_http: scheme = http
2007-03-02 09:17:38.267757 soap_transport_http: host = eenadres.nl
2007-03-02 09:17:38.267843 soap_transport_http: user = eengebruiker
2007-03-02 09:17:38.267928 soap_transport_http: pass = eenwachtwoord
2007-03-02 09:17:38.268013 soap_transport_http: path = /index.php
2007-03-02 09:17:38.268107 soap_transport_http: set Host: eenadres.nl
2007-03-02 09:17:38.268204 soap_transport_http: Set credentials for authtype basic
2007-03-02 09:17:38.268309 soap_transport_http: set Authorization: Basic YWRtaW...
2007-03-02 09:17:38.268416 soap_transport_http: set User-Agent: NuSOAP/0.7.2 (1.94)
2007-03-02 09:17:38.268510 soap_transport_http: set Content-Type: text/xml; charset=ISO-8859-1
2007-03-02 09:17:38.268598 soap_transport_http: set SOAPAction: ""
2007-03-02 09:17:38.268783 soap_transport_http: entered send() with data of length: 561
2007-03-02 09:17:38.268884 soap_transport_http: connect connection_timeout 0, response_timeout 30, scheme http, host eenadres.nl, port 80
2007-03-02 09:17:38.268976 soap_transport_http: calling fsockopen with host staging.encoding.dutchview.nl connection_timeout 0
2007-03-02 09:17:38.275170 soap_transport_http: set response timeout to 30
2007-03-02 09:17:38.275324 soap_transport_http: socket connected
2007-03-02 09:17:38.275439 soap_transport_http: set Content-Length: 561
2007-03-02 09:17:38.275534 soap_transport_http: HTTP request: POST /index.php HTTP/1.0
2007-03-02 09:17:38.275636 soap_transport_http: HTTP header: Host: eenadres.nl
2007-03-02 09:17:38.275726 soap_transport_http: HTTP header: Authorization: Basic YWRtaW46ZHV0Y2gxMnZpZXc=
2007-03-02 09:17:38.275815 soap_transport_http: HTTP header: User-Agent: NuSOAP/0.7.2 (1.94)
2007-03-02 09:17:38.275903 soap_transport_http: HTTP header: Content-Type: text/xml; charset=ISO-8859-1
2007-03-02 09:17:38.275992 soap_transport_http: HTTP header: SOAPAction: ""
2007-03-02 09:17:38.276082 soap_transport_http: HTTP header: Content-Length: 561
2007-03-02 09:17:38.276190 soap_transport_http: wrote data to socket, length = 791
2007-03-02 09:18:08.273726 soap_transport_http: read line of 0 bytes: 
2007-03-02 09:18:08.273890 soap_transport_http: socket read of headers timed out after length 0
2007-03-02 09:18:08.273980 soap_transport_http: read before timeout: 
2007-03-02 09:18:08.274072 soap_transport_http: end of send()
2007-03-02 09:18:08.274231 soapclient: Error: HTTP Error: socket read of headers timed out

Doe maar een onsje meer...


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Je SoapAction header is leeg, die is wel belangrijk heb ik geleerd. Verder heb ik hier zelf ook een hele tijd mee zitten te klooien (PHP via Soap naar een .net webservice laten praten) en de volgende wrapper class doet voor mij uiteindelijk z'n werk, misschien dat je er iets aan hebt:

PHP:
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
36
37
38
39
40
41
<?

require_once('./lib/nusoap.php');

class DotNetSoapClient
{
    var $WSDL, $namespace, $client;
    function __construct()
    {
        $this->WSDL = "http://*******/MainService.asmx?WSDL";
        $this->namespace = "urn:xmlns:lto:ltows";
    }

    function Login($username, $password) 
    {
        $input = $this->query("Login", array("loginName" => $username, "password"=>$password));
        return ($input['LoginResult']);
    }
    
    function query($action, $parameters = array())
    {
        $this->client = new nusoapclient($this->WSDL);
        $soapaction = $this->namespace."/".$action;

        $requestbody = "<{$action} xmlns='{$this->namespace}'>";
        
        foreach($parameters as $key=>$val)
        {
            $requestbody .= "<{$key}>{$val}</{$key}>";
        }
        $requestbody .= "</{$action}>";

        $soapmessage = $this->client->serializeEnvelope($requestbody,'',array(),'document', 'literal'); // dit deed uiteindelijk de truc bij mij
        $response = $this->client->send($soapmessage, $soapaction); // soap action mag dus niet leeg zijn! dit is de functie die je gaat aanroepen
    
        if($this->client->fault)    return false;
        return($response);

    }

}


Hope that helps :)

[ Voor 4% gewijzigd door SchizoDuckie op 02-03-2007 10:14 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
- edit -

Bovenstaand script doet zo te zien iets wat al standaard in NuSOAP volgens mij zit. Want je kan soapactions meegeven in de call naar de server script.

[ Voor 189% gewijzigd door Intheweb op 07-03-2007 14:12 ]

Doe maar een onsje meer...


Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
Onderstaande is een gedeelte uit het systeem wat ik gebruik.
En ik blijf maar niet snappen wat ik verkeerde doe...

Server
PHP:
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
<?PHP
// Load files
require_once('lib/nusoap.php');
require_once('lib/getid3/getid3/getid3.php');

// Start the NuSoap server
$server = new soap_server;

$server->register(
    'getHeaderAssets',
    array('directory' => 'xsd:string'),
    array('return' => 'xsd:string'),
    'uri:xfr',
    'uri:xfr/getHeaderAssets',
    'rpc',
    'encoded'
);

$server->register(
    'createDir',                        // method name
    array('directory' => 'xsd:string'),      // input parameters
    array('return' => 'xsd:string'),    // output parameters
    'uri:xfr',                          // namespace
    'uri:xfr/createDir',                // SOAPAction
    'rpc',                              // style
    'encoded'                           // use
);

................


Client
PHP:
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
36
37
38
39
40
41
42
43
44
45
46
<?PHP
    // Input variabels
    // $server  =   Server information, where the Soap server is located
    // $
    function loadSoap($soapserver, $function, $items, $debug = FALSE) {
    
        // Load the server info
        $server =   serverInfo($soapserver);
        
        // Load files
        require_once('/home/ergens.nl/www/remote/lib/nusoap.php');
        
        // Start the client
        $soapclient = new soapclient($server['host']);
        // Load the debug
        $soapclient =& new soapclient($server['host']);

        // Let's give the transit server the assignment to upload the asset(s) to the media server
        if($err = $soapclient->getError()){
            // handle error however
        } else {
        
        // Call the SOAP method
            $return_val = $soapclient->call(
                            $function,                     // method name
                            $items,    // input parameters
                            'uri:xfr',            // namespace
                            'uri:xfr/'.$function.'');       // SOAPAction
        
            //$return_val = $soapclient->call($function, $items);
                if($err = $soapclient->getError()) {
                    // handle error however
                } else {
                    // do something w/ return val
                }
            }
            
        if($debug == TRUE) {
            echo 'Request: <xmp>'.$soapclient->request.'</xmp>';
            echo 'Response: <xmp>'.$soapclient->response.'</xmp>';
            echo 'Debug log: <pre>'.$soapclient->debug_str.'</pre>';
        }
    
        return $return_val;
    }
?>

Doe maar een onsje meer...


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Gebruik je aan allebei de kanten NuSoap, of alleen aan de client-kant? Wat draait er aan de serverkant?

Heb je het al met andere client code geprobeerd? Een Python-scriptje?

Ik heb wel eens wat SOAP getest met een speciaal testprogramma, geschreven in Java en open source, maar ik kan het nu niet terugvinden. Misschien daar even naar kijken?

Rustacean


Acties:
  • 0 Henk 'm!

  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 21:42
Volgens de tijden in je log is er een timeout van 30 seconden, op het lezen van de socket.

Je server geeft gewoon een goede response terug (weliswaar op dit moment met nog wat onzin bovenin de response, maar dat terzijde). Dat heb ik kunnen testen want alle benodigde info van je webservice staat in je debug-log en in je voorbeeldcode. Aan de server ligt het dus niet, maar ergens aan de clientkant bij de socketverbinding.

Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
Het vreemde is dat, ook al komt er een response terug dat hij toch 30 seconde lang blijft lezen.

Beide kanten gebruiken NuSoap en het moet met PHP draaien.

Wel zit ik er aan te denken om de communicatie toch anders te laten lopen en hem ipv via SOAP XML, normale XML te laten gebruiken en daar mijn eigen client voor te schrijven. Heeft iemand hier misschien ideeen over?

Doe maar een onsje meer...


Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
Een update op dit verhaal...

Ik ben bezig gegaan met XML-RPC.. en ik heb PRECIES hetzelfde!

Gewoon geen data dat terug komt.

Lijkt er op als of het script time-out. Wat opzich al erg vaag is omdat dit zou moeten gebeuren in een mili-seconde...
Want dit gebeurde op de server waar die eerst stond echt gelijk, de data stond echt binnen no-time op het scherm.

Verschil tussen beide server is dat de eerste server PHP4 draaide en de huidige PHP5...
Maar dat zou in een verbinding toch weinig moeten uitmaken...

Heeft iemand een idee wat het probleem kan zijn?

Doe maar een onsje meer...


Acties:
  • 0 Henk 'm!

Verwijderd

als je php5 gebruikt dan kan je ook de ingebouwde soap functies gebruiken, zie http://nl3.php.net/manual/en/ref.soap.php

heb ik zelf goeie ervaringen mee, nog niet dit soort bovenstaande problemen mee gehad.

Acties:
  • 0 Henk 'm!

  • Intheweb
  • Registratie: April 2005
  • Laatst online: 20:04
Om deze topic nog even te voorzien van de oplossing:
het zat hem totaal niet in de PHP, maar aan de firewall van de server.

De server is in beheer bij een andere maatschappij en zij kwamen maar niet achter de fout. Op ten duur had iemand met echte unix kennis er naar gekeken en die had het probleem zo opgelost: firewall foutje...

Werkte gelijk weer.

Doe maar een onsje meer...

Pagina: 1