2011-01-11 3 views
5

Noob Frage.Wie konsumieren Sie einen statusbehafteten Web-Service mit der SoapClient-Klasse von PHP?

Ich entwickle eine PHP-Website, die einen Stateful Web Service verbraucht. Grundsätzlich ist der "Ablauf der Kontrolle" meiner Website der folgende:

  1. Der Benutzer wird eine Seite angezeigt.
  2. Der Benutzer führt eine Aktion aus.
  3. Der Server der Website führt eine Anfrage an den Web-Service durch, wobei Benutzereingaben als Parameter verwendet werden.
  4. Der Server des Web-Service führt die Anforderung aus und wechselt dabei von Status A zu Status B.
  5. Der Server der Website leitet den Benutzer auf eine andere Seite, und wir gehen zurück 1.

Mein Problem, dass verliert die Website den Überblick über die zwischen den Anforderungen staatlichen Web-Service ist zu treten. Wie kann ich sicherstellen, dass die Website den Status des Web-Service nachverfolgt? Ich verwende PHP-Standard SoapClient Klasse.

Ich habe versucht, das SoapClient Objekt in eine Session-Variable Serialisierung:

# ws_client.php 
<?php 
function get_client() 
{ 
    if (!isset($_SESSION['client'])) 
     $_SESSION['client'] = new SoapClient('http://mydomain/MyWS/MyWS.asmx?WSDL', 'r'); 
    return $_SESSION['client']; 
} 
function some_request($input1, $input2) 
{ 
    $client = get_client(); 
    $params = new stdClass(); 
    $params['input1'] = $input1; 
    $params['input2'] = $input2; 
    return $client->SomeRequest($params)->SomeRequestResult; 
} 
function stateful_request($input) 
{ 
    $client = get_client(); 
    $params = new stdClass(); 
    $params['input'] = $input; 
    return $client->StatefulRequest($params)->StatefulRequestResult; 
} 
?> 

# page1.php 
<?php 
session_start(); 
$_SESSION['A'] = some_request($_POST['input1'], $_POST['input2']); 
session_write_close(); 
header('Location: page2.php'); 
?> 

# page2.php 
<?php 
session_start(); 
echo $_SESSION['A']; // works correctly 
echo stateful_request($_SESSION['A']); // fails 
session_write_close(); 
?> 

Aber es funktioniert nicht. Was ist falsch an meinem Code?

Antwort

0

Um den statusbehafteten Webdienst zu verwenden, müssen Sie die Sitzungs-ID der Serversitzung im SOAP-Cookie auf der Clientseite festlegen. Standardmäßig generiert der Server jedes Mal, wenn eine SOAP-Anforderung gesendet wird, eine eindeutige Sitzungs-ID. Um dies zu verhindern, muss nur die Sitzungs-ID aus der ersten Anfrage in SOAP-Cookie gesetzt werden. Dieser Cookie wird mit allen folgenden Soap-Anrufen gesendet. zum Beispiel, wenn Sie ein ASP.net Webservice mit SOAP verbrauchen, dann nach dem ersten WS Anruf, bekommen Sie die Antwort-Header wie folgt aus:

$client = SoapClient("some.wsdl", array('trace' => 1)); 
$result = $client->SomeFunction(); 
$headers = $client->__getLastResponseHeaders(); 

Jetzt $headers die Session-ID mit einem Namen wie ‚ASP enthalten muss. NET_SessionId '. Holen Sie sich das ID aus der $headers und ein Cookie wie folgt erstellen:

//$client->__setCookie($cookieName, $cookieValue); 
$client->__setCookie('ASP.NET_SessionId', $cookieValue); 

Nun sind alle SOAP-Anforderungen von Ihrem Client enthält diese Session-ID und Ihr Zustand wird auf dem Server bestehen bleiben.

Verwandte Themen