Frage

Ich versuche, einen Stateful-Web-Service in PHP mit der SOAP-Erweiterung zu implementieren. (Ja, ich weiß, dass Web-Services sollen staatenlos sein, meinetwegen, um wirklich zu bestehen einige Form einer Session-ID ist, damit ich bei jedem Aufruf an den Dienst authentifizieren müssen nicht). PHP.net der API-Dokumentation etwas fehlt auf diesem, und es ist auf sie sonst nicht viel geschrieben.

Ich fand eine Seite, die es diskutiert ( http://bytes.com/forum/thread160816.html ) und implementiert den Code als Test. Ich baute eine kleine .NET-Anwendung, die die Webdienst verbraucht und ruft jede Funktion und zeigt das Ergebnis. Von dem, was ich gelesen habe, wird die PHP SOAP-Erweiterung Klassenvariablen zwischen den Anrufen bestehen bleiben, solange die Funktionalität in einer Klasse gekapselt ist mit der setClass () -Funktion und die setPersistence () Funktion SOAP_PERSISTENCE_SESSION geben wird.

Hier ist mein Code:

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

?>

Das Problem, das ich in laufen, ist, dass $ name nicht zwischen Anrufen beibehalten wird - ich immer den initialisierten Wert bekommen und nicht der Wert I zu setName zuweisen (). Wie ich bereits sagte, versuche ich, nach der Authentifizierung gegenüber einer Datenbank einer Session-ID zu bestehen - wenn jemand eine bessere Art und Weise hat diesen Ich bin offen für Vorschläge zu tun; jedoch möchte ich noch den allgemeinen Fall lösen. Wer irgendwelche Ideen?

War es hilfreich?

Lösung

Ich löste eigentlich mein eigenes Problem.

Ich arbeite unter den Annahmen, dass: 1) .NET Cookies automatisch behandelt; und 2) war mein Problem mit der PHP. Weder war der Fall. Mein PHP-Code war in Ordnung, aber ich brauchte ein weiteres Element meiner .NET-Code hinzufügen, um die Session-Cookie zu behandeln.

Nach dem Web-Service-Objekt zu erhalten, musste ich eine Instanz der Klasse Cookie an das Web-Service-Objekt zuweisen. Mein letzter Client-Seite Code ist unter:

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();
        }
    }
}

Danke trotzdem!

Andere Tipps

Die meisten Seifen Clients starten eine neue Verbindung für jede Anforderung so gibt es keine „Session“ ist.

Wenn es Ihr SOAP-Dienst Sie können die Session-ID irgendwo innerhalb des SOAP-Umschlag auf jeder Antwort senden und die Kunden auffordern, die Session-ID auf jeder nachfolgenden Anforderung zu übergeben.

Das ist viel schöner als Ihr Kunde jetzt Anhaltspunkt und die Kontrolle über die beheaviour hat.

Für den Stateful-Web-Service raubend, müssen Sie auf Client-Seite die Session-ID der Server-Sitzung in dem SOAP-Cookie setzen. Standardmäßig Anfrage jedes Mal SOAP gesendet wird, erzeugt der Server eine eindeutige Sitzungs-ID. Um zu verhindern, dass nur gesetzt die Sitzungs-ID aus dem ersten Anforderung in SOAP-Cookie bekam. Das Cookie wird mit allen nachfolgenden Seife Anrufe gesendet werden. Zum Beispiel, wenn Sie ein ASP.net Webservice mit SOAP verbrauchen, dann nach dem ersten WS Anruf, bekommen Sie die Antwort-Header wie folgt aus:

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

Jetzt $headers muss die Session-ID mit einem Namen wie ‚ASP.NET_SessionId‘ enthalten. Holen Sie sich das ID aus der $headers und erstellen Sie ein Cookie wie folgt:

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

Nun sind alle SOAP-Anforderungen von Ihrem Client enthält diese Session-ID und Ihr Zustand wird auf dem Server bestehen bleiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top