PHP nusoap(webservice)让class alive + C#

时间:2014-05-19 11:22:20

标签: c# php web-services

我试图在各种功能中保持同一个类的活着。这与PHP完美配合,但是当我在C#中使用相同的函数时,它不能按预期工作。

我的index.php文件包含:

<?php 
    require_once('nusoap/lib/nusoap.php'); 
    require_once('libs/webservice.php');

    $web    = new webservice(); // this is a class

    function login($user_email, $user_password){
        global $web;
        return json_encode($web->login($user_email, $user_password));
    }

    function getClients(){
        global $web;
        return json_encode($web->getClients());
    }

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
    $server = new soap_server();
    $server->register("login");
    $server->register("getClients");
    $server->service($HTTP_RAW_POST_DATA);

?>

如果我在$server->service($HTTP_RAW_POST_DATA);之后添加以下PHP代码仅用于测试:

echo login("testing@hotmail.com", "testing"); // returns TRUE > which is correct
echo getClients(); // returns TRUE > which is correct

效果很好。该类包含将在其他函数中使用的user_id。 现在,班级 webservice 具有以下内容:

class webservice{

    private $user;
    private $user_id;

    public function __construct(){
        require_once("../libs/user.php");
        $this->user     = new users();
    }

    public function login($email, $password){
        $results = $this->user->logIn($email, sha1($password));

        if($results['id'] == null){
            return json_encode(array("message" => false));
        }

        $this->user_id  = $results['id']; // holds the user id for further functions needs

        return json_encode(array("message" => true));
    }

    public function getClients(){
        if($this->user_id == null){
            return json_encode(array("message" => false));
        }

        return json_encode(array("message" => true));
    }
}
?>

正如我所说,在PHP中这很有用。但是,当我在C#中使用此Web服务时,由于getclients()等于null,我无法从user_id函数检索结果TRUE。 一旦登录,它就不会 user_id

WebReference.myWebservice webS = new WebReference.myWebservice();
public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    JObject login = JObject.Parse(webS.login("testing@hotmail.com", "testing"));
    MessageBox.Show(login["message"].ToString()); // returns TRUE

    JObject clients = JObject.Parse(webS.getClients());
    MessageBox.Show(clients["message"].ToString()); // returns FALSE
}

我知道问题出在 index.php 页面上,但我该如何实现我正在寻找的内容?

1 个答案:

答案 0 :(得分:0)

每次调用webservice时,脚本都会在php中创建一个class webservice的新实例。这意味着您的$user_id将不会保留上次请求的用户ID。

您应该通过登录功能返回哈希(会话)和用户标识。将哈希和用户标识存储在c#中。之后,您的哈希和用户ID应该是每个请求的一部分。在您的webservice类中验证它并返回用户请求的结果。

我希望你能按照我的指示行事。

也许看看twitters rest service api: https://dev.twitter.com/docs/auth/application-only-auth

我喜欢他们这样做的方式。您发送身份验证请求,Twitter返回称为bearer的哈希。之后,每个请求都包含一个带有承载值的Authorization标头。