1

SOAP拡張機能を使用してPHPでステートフルWebサービスを実装しようとしています。(はい、Webサービスはステートレスであると想定されていることを知っています。私が本当に気にかけているのは、何らかの形式のセッションIDだけなので、サービスを呼び出すたびに認証する必要はありません)。PHP.netのAPIドキュメントにはこれがいくらか欠けており、他に多くのことが書かれていません。

それについて説明しているページ(http://bytes.com/forum/thread160816.html)を見つけ、テストとしてコードを実装しました。Webサービスを使用し、各関数を呼び出して結果を表示する小さな.NETアプリケーションを作成しました。私が読んだところによると、PHP SOAP拡張機能は、機能がsetClass()関数を使用してクラスにカプセル化され、setPersistence()関数がSOAP_PERSISTENCE_SESSIONに渡される限り、呼び出し間でクラス変数を永続化します。

これが私のコードです:

<?php

class User 
{
    var $name = "Initial value";

    function setName($name) 
    {
        $this->name = $name;

        // Tried this too.
        // $this->name = "Set to string constant" ;
    }

    function getName() 
    {
        // This always returns "Initial value"
        return $this->name;
    }
}


// Tried placing session_start() in several places
// before $server->handle()...
// One guy says this doesn't need to be called.
// I assume it depends on if session autostart is on.
session_start();

$server = new SoapServer(null, array('uri' => 'http://localhost/'));
$server->setClass('User');
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();

?>

私が遭遇した問題は、$ nameが呼び出し間で永続化されないことです。つまり、setName()に割り当てた値ではなく、常に初期化された値を取得します。私が述べたように、私はデータベースに対して認証した後、セッションIDを永続化しようとしています-誰かがこれを行うためのより良い方法を持っているなら、私は提案を受け入れます。しかし、私はまだ一般的なケースを解決したいと思います。誰かアイデアはありますか?

4

3 に答える 3

1

私は実際に自分の問題を解決しました。

1) .NET は Cookie を自動的に処理する。2)私の問題はPHPにありました。どちらもそうではありませんでした。私の PHP コードは問題ありませんでしたが、セッション Cookie を処理するために、.NET コードにもう 1 つの要素を追加する必要がありました。

Web サービス オブジェクトをインスタンス化した後、CookieContainer クラスのインスタンスを Web サービス オブジェクトに割り当てる必要がありました。私の最終的なクライアント側のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WsTest
{
    public partial class PhpWsForm : Form
    {
        private localhost.MyWebService ws;

        public PhpWsForm()
        {
            InitializeComponent();
            ws = new WsTest.localhost.MyWebService();

            // The line below is the part that I forgot!
            ws.CookieContainer = new System.Net.CookieContainer();
        }

        private void butSetVal_Click(object sender, EventArgs e)
        {
            ws.setName(txtSetVal.Text);
        }

        private void butGetVal_Click(object sender, EventArgs e)
        {
            txtGetVal.Text = ws.getName();
        }
    }
}

とにかくありがとう!

于 2008-11-18T00:59:56.783 に答える
0

ステートフル 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:27:15.583 に答える
0

ほとんどの SOAP クライアントは、リクエストごとに新しい接続を開始するため、「セッション」はありません。

SOAP サービスの場合、すべての応答で SOAP エンベロープ内のどこかにセッション ID を送信し、後続のすべての要求でセッション ID を渡すようにクライアントに依頼できます。

これは、クライアントが行動の手がかりと制御を持っているため、はるかに優れています.

于 2008-11-17T16:19:03.777 に答える