Sabun kullanarak Uyarlanan PHP Web Hizmeti

3 Cevap

Ben SOAP uzantısı kullanarak PHP durumsal bir web hizmeti uygulamaya çalışıyorum. (Evet web hizmetleri vatansız olması gerekiyordu olduğunu biliyorum, ben gerçekten kalıcı umrumda yüzden servise her çağrı ile kimlik doğrulaması gerekmez bir oturum kimliği bazı biçimidir). PHP.net 'nin API belgelerine biraz bu konuda eksik ve üzerine yazılmış başka pek bir şey yok.

Onu (http://bytes.com/forum/thread160816.html) anlatılır bir sayfa buldum ve bir test olarak uygulanan kod. Ben web hizmeti tüketir ve her işlevini çağırır ve sonucu görüntüler küçük. NET uygulama inşa. Okuduğum kadarıyla, PHP SOAP uzantısı sürece işlevsellik () fonksiyonu SOAP_PERSISTENCE_SESSION geçirilir setClass () fonksiyonu ve setPersistence kullanarak bir sınıf kapsüllü olduğu gibi aramalar arasında sınıf değişkenleri devam edecek.

İşte benim kod:

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

?>

Ben çalıştırmak sorun $ isim aramalar arasında kalıcı olmasıdır - Hep başlatıldı değerini almak ve değeri değil, ben isimAta atamak (). Ben de belirtildiği gibi, ben bir veritabanı karşı kimlik doğrulaması sonra bir oturum kimliği devam çalışıyorum - Herkes Önerilere açığım bunu yapmak için daha iyi bir yolu varsa; Ancak, ben yine de genel davayı çözmek istiyoruz. Herkes herhangi bir fikir var mı?

3 Cevap

Ben aslında benim kendi sorunu çözüldü.

. Ben varsayımlar altında çalışıyordu: 1) NET çerezleri otomatik olarak yönetir; ve 2) benim problem PHP ile oldu. Ne böyleydi. Benim PHP kodu iyiydi ama ben oturum tanımlama işlemek için benim. NET koduna bir daha eleman eklemek gerekiyordu.

Web hizmet nesnesi başlatıldıktan sonra, ben web hizmeti nesnesine CookieContainer sınıfının bir örneğini atamak gerekiyordu. Benim son istemci tarafında kod aşağıda:

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

Yine de teşekkürler!

Hayır "oturum" var bu yüzden çoğu sabun müşteriler her istek için yeni bir bağlantı başlatın.

Onun SOAP servis Eğer her cevapta üzerinde SOAP zarfı yere içindeki session id göndermek ve sonraki her istek üzerine session id geçmek için müşteri sorabilirsiniz.

Bu istemci şimdi ipucu ve beheaviour üzerinde kontrole sahip gibi çok güzel.

For consuming the stateful web service, you need to set the session ID of the server session in the SOAP cookie on client side. By default each time SOAP request is sent, the server generates a unique session ID. To prevent that just set the session ID got from first request in SOAP cookie. That cookie will be sent with your all subsequent soap calls. FOr example if you are consuming an ASP.net webservice using SOAP, then after the first WS call, get the response headers like this:

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

Şimdi $headers 'ASP.NET_SessionId' gibi bir isim ile oturum kimliği içermelidir. $headers gelen kimliği alın ve aşağıdaki gibi bir çerez oluşturmak:

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

Şimdi istemci tüm SOAP istekleri bu oturum kimliği içerecek ve devlet sunucu üzerinde devam edecektir.