2011-01-11 20 views
5

pregunta de Noob.¿Cómo consumir un servicio web con estado usando la clase SoapClient de PHP?

Estoy desarrollando un sitio web PHP que consume un servicio web con estado. Básicamente, el "flujo de control" de mi sitio web es el siguiente:

  1. Al usuario se le muestra una página.
  2. El usuario realiza una acción.
  3. El servidor del sitio web realiza una solicitud al servicio web, utilizando la entrada del usuario como parámetros.
  4. El servidor del servicio web ejecuta la solicitud y pasa del estado A al estado B en el proceso.
  5. El servidor del sitio web redirige al usuario a otra página, y volver al paso 1.

Mi problema es que el sitio Web pierde la pista del estado del servicio Web entre las peticiones. ¿Cómo hago que el sitio web realice un seguimiento del estado del servicio web? Estoy usando la clase estándar SoapClient de PHP.

He intentado serializar el objeto SoapClient en una variable de sesión:

# 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(); 
?> 

Pero no funciona. ¿Qué pasa con mi código?

Respuesta

0

Para consumir el servicio web con estado, debe establecer el ID de sesión de la sesión del servidor en la cookie SOAP en el lado del cliente. De forma predeterminada, cada vez que se envía una solicitud SOAP, el servidor genera una ID de sesión única. Para evitar eso, solo configure la ID de la sesión obtenida a partir de la primera solicitud en la cookie SOAP. Esa cookie se enviará con todas tus llamadas subsecuentes. por ejemplo, si usted está consumiendo un servicio web ASP.net utilizando SOAP, a continuación, después de la primera llamada WS, obtener las cabeceras de respuesta como esta:

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

Ahora $headers debe contener el identificador de sesión con un nombre como 'ASP. NET_SessionId '. Obtener el ID de la $headers y crear una galleta de la siguiente manera:

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

Ahora todas las peticiones SOAP de su cliente contendrá este ID de sesión y su estado persistirá en el servidor.

Cuestiones relacionadas