2011-01-11 15 views
5

Noob问题。如何使用PHP的SoapClient类来使用有状态的Web服务?

我正在开发一个使用有状态Web服务的PHP Web站点。基本上,我的网站的“控制流程”如下:

  1. 用户被显示在一页上。
  2. 用户执行操作。
  3. 网站的服务器使用用户输入作为参数向Web服务发出请求。
  4. Web服务的服务器执行该请求,并在过程中从状态A转到状态B.
  5. 该网站的服务器将用户重定向到另一个页面,我们回到步骤1

我的问题是,该网站无法跟踪Web服务的请求之间的状态。我如何使Web站点跟踪Web服务的状态?我正在使用PHP的标准SoapClient类。

我试图序列化对象SoapClient到一个会话变量:

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

但它不工作。我的代码有什么问题?

回答

0

要使用有状态的Web服务,需要在客户端的SOAP Cookie中设置服务器会话的会话标识。默认情况下,每次发送SOAP请求时,服务器都会生成唯一的会话ID。为了防止在SOAP cookie中设置从第一个请求获得的会话ID。该cookie将随后发送您的所有肥皂电话。 例如,如果您正在使用SOAP,那么第一个WS调用后消耗了ASP.net web服务,得到了响应报头是这样的:

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

现在$headers必须包含会话ID与像“ASP的名称。 NET_SessionId”。获得从$headers的ID,并创建一个cookie如下:

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

现在从客户端的所有的SOAP请求会包含此会话ID和你的状态将持续到服务器上。