5

菜鸟问题。

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

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

我的问题是网站在请求之间失去了对 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();
?>

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

4

3 回答 3

2

您将需要使用 http://php.net/manual/en/soapclient.getlastresponseheaders.php 来查找服务器返回的“set-cookie”标头,然后使用 http://php.net/manual/en /soapclient.setcookie.php 在发送后续请求时设置该 cookie。抱歉,因为我不懂 PHP,所以无法编写示例代码。

于 2011-01-11T22:04:39.777 回答
1

要使用有状态的 Web 服务,您需要在客户端的 SOAP cookie 中设置服务器会话的会话 ID。默认情况下,每次发送 SOAP 请求时,服务器都会生成一个唯一的会话 ID。为了防止这种情况,只需设置从 SOAP cookie 中的第一个请求获得的会话 ID。该 cookie 将与您所有后续的肥皂电话一起发送。例如,如果您使用 SOAP 使用 ASP.net Web 服务,则在第一次 WS 调用之后,获取如下响应标头:

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

现在$headers必须包含名称类似于“ASP.NET_SessionId”的会话 ID。从 中获取 ID$headers并创建一个 cookie,如下所示:

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

现在,来自客户端的所有 SOAP 请求都将包含此会话 ID,并且您的状态将在服务器上持续存在。

于 2012-04-13T10:26:44.507 回答
1

您还可以通过访问 $my_soapclient->_cookies 直接从 soap 客户端获取 cookie,因此您不必手动解析响应标头。

请参阅此处:阅读 HTTP 响应标头中的 Set-Cookie 指令

但是php手册中没有关于此的内容。

于 2013-01-21T10:29:03.240 回答