1

我一直在尝试让 WPF 客户端连接到 PHP 服务器,登录并获取“IsLogged.php”以验证客户端是否已登录。但是,“IsLogged.php”总是返回客户端未登录已通过身份验证,我做错了什么?

服务器代码:

“创建帐户.php”

session_start();

if (isset($_POST['user']))
{
    $_SESSION['UserName'] = $_POST['user'];
    echo "check";
}

“IsLogged.php”

session_start();

if (isset($_SESSION['UserName']))
{
    echo "allowed";
}
else
{
    echo "not allowed";
}

客户端代码:

“发布”方法

    public static string Post(string RequestName, string PostData, out HttpStatusCode ReturnCode)
    {
        byte[] byteArray = Encoding.UTF8.GetBytes(PostData);

        WebRequest Request = WebRequest.Create(ChatAPI.Settings.BaseUrl + RequestName);
        Request.Method = "POST";
        Request.ContentType = "application/x-www-form-urlencoded";
        Request.ContentLength = byteArray.Length;

        Stream dataStream = Request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse response = Request.GetResponse();
        dataStream = response.GetResponseStream();

        ReturnCode = ((HttpWebResponse)response).StatusCode;

        StreamReader reader = new StreamReader(dataStream);
        string returnedData = reader.ReadToEnd();

        reader.Close();
        dataStream.Close();
        response.Close();

        return returnedData;
    }

最后是触发 POST 请求的窗口。

        HttpStatusCode Code;
        MessageBox.Show(General.Post("IsLogged", "", out Code)); --> Not allowed (intended)
        MessageBox.Show(General.Post("CreateAccount", "user=jan", out Code)); --> check (intended)
        MessageBox.Show(General.Post("IsLogged", "", out Code)); --> Not allowed (should be allowed)

为什么服务器没有将请求注册为会话?

4

1 回答 1

0

服务器识别客户端(以及相应的会话状态)的方式是通过 cookie。

基本上,在CreateAccount请求中,服务器将 cookie 附加到其响应中,并期望客户端在每个后续请求中都显示 cookie。

如果请求中不存在 cookie,则服务器无法识别客户端并将请求视为来自未知来源。

您的代码根本不管理 cookie,因此这就是为什么 C# 客户端总是显示为 PHP 服务器的新客户端的原因。

保存从服务器接收到的 cookie 并将其显示在每个新请求中的最简单方法是使用 的实例CookieContainer并将其附加到您发出的每个请求中。

我没有尝试这段代码,所以我不能 100% 确定语法,但这是一个起点:

// this instance will be reused across multiple requests
private static CookieContainer cookieContainer = new CookieContainer();

public static string Post(string RequestName, string PostData, out HttpStatusCode ReturnCode)
{
    byte[] byteArray = Encoding.UTF8.GetBytes(PostData);

    WebRequest Request = WebRequest.Create(ChatAPI.Settings.BaseUrl + RequestName);
    Request.Method = "POST";
    Request.ContentType = "application/x-www-form-urlencoded";
    Request.ContentLength = byteArray.Length;

    Request.CookieContainer = cookieContainer; // this line is new

    Stream dataStream = Request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();

    WebResponse response = Request.GetResponse();
    dataStream = response.GetResponseStream();

    ReturnCode = ((HttpWebResponse)response).StatusCode;

    StreamReader reader = new StreamReader(dataStream);
    string returnedData = reader.ReadToEnd();

    reader.Close();
    dataStream.Close();
    response.Close();

    return returnedData;
}
于 2013-09-20T21:59:20.353 回答