首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用PHP的SoapClient类使用有状态Web服务?

如何使用PHP的SoapClient类使用有状态Web服务?
EN

Stack Overflow用户
提问于 2011-01-11 13:59:36
回答 3查看 4.6K关注 0票数 5

努布问题。

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

parameters.

  • The
  1. 向用户显示一个页面。
  2. 用户执行一个操作。Web站点的服务器向Web发出请求,在Web服务服务器执行请求时使用用户输入,并在执行过程中从状态A转到状态B。Web站点的服务器将用户重定向到另一个页面,我们回到步骤1。

G 211

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

我尝试将SoapClient对象序列化为会话变量:

代码语言:javascript
运行
AI代码解释
复制
# 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();
?>

但不起作用。我的密码怎么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-11 14:04:39

您需要使用http://php.net/manual/en/soapclient.getlastresponseheaders.php查找服务器重新生成的" set - cookie“报头,然后在发送后续请求时使用http://php.net/manual/en/soapclient.setcookie.php设置该cookie。对不起,由于我不知道任何PHP,所以不能编写示例代码。

票数 2
EN

Stack Overflow用户

发布于 2012-04-13 02:26:44

为了使用有状态web服务,您需要在客户端的SOAP cookie中设置服务器会话的会话ID。默认情况下,每次发送SOAP请求时,服务器都会生成一个唯一的会话ID。该cookie将与所有后续soap调用一起发送。FOr示例如果您正在使用SOAP使用ASP.net get服务,那么在第一个WS调用之后,获得如下所示的响应头:

代码语言:javascript
运行
AI代码解释
复制
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
$headers = $client->__getLastResponseHeaders();

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

代码语言:javascript
运行
AI代码解释
复制
//$client->__setCookie($cookieName, $cookieValue);
$client->__setCookie('ASP.NET_SessionId', $cookieValue);

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-21 02:29:03

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

见此处:Reading the Set-Cookie instructions in an HTTP Response header

但是php手册中没有这方面的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4663112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档