簡體   English   中英

C#發布請求未標識為會話

[英]C# post requests not identified as session

我一直在嘗試讓WPF客戶端連接到PHP服務器,自行登錄並獲取“ IsLogged.php”以驗證客戶端已登錄。但是,“ IsLogged.php”始終返回客戶端未登錄的信息。身份驗證,我在做什么錯?

服務器代碼:

“ CreateAccount.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)

服務器為什么不將請求注冊為會話?

服務器識別客戶端的方式(以及相應的會話狀態)是通過cookie。

基本上,在CreateAccount請求中,服務器將cookie附加到其響應中,並希望客戶端在每個后續請求中都顯示cookie。

如果請求中不存在Cookie,則服務器將無法識別客戶端並將請求視為來自未知源。

您的代碼根本不管理cookie,因此這就是C#客戶端始終看起來是PHP服務器的新客戶端的原因。

保存從服務器接收的cookie並將其顯示在每個新請求中的最簡單方法是使用CookieContainer的實例, 並將其附加到您提出的每個請求上

我沒有嘗試過這段代碼,所以我不確定語法的百分百,但這是一個起點:

// 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM