5

Noobの質問。

ステートフルWebサービスを使用するPHPWebサイトを開発しています。基本的に、私のWebサイトの「制御の流れ」は次のとおりです。

  1. ユーザーにページが表示されます。
  2. ユーザーがアクションを実行します。
  3. Webサイトのサーバーは、ユーザー入力をパラメーターとして使用して、Webサービスへの要求を実行します。
  4. Webサービスのサーバーは要求を実行し、プロセスで状態Aから状態Bに移行します。
  5. Webサイトのサーバーはユーザーを別のページにリダイレクトし、ステップ1に戻ります。

私の問題は、Webサイトがリクエスト間で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();
?>

しかし、それは機能しません。私のコードの何が問題になっていますか?

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 を生成します。これを防ぐには、最初のリクエストから取得したセッション ID を SOAP Cookie に設定します。その Cookie は、後続のすべての SOAP 呼び出しで送信されます。たとえば、SOAP を使用して ASP.net Web サービスを使用している場合、最初の WS 呼び出しの後、次のような応答ヘッダーを取得します。

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

「 ASP.NET_SessionId $headers」のような名前のセッション 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 に答える