【问题标题】:C# keeping cookies and sessions across webpagesC# 跨网页保存 cookie 和会话
【发布时间】:2015-10-03 04:26:00
【问题描述】:

我在这里和 Google 都尝试了很多示例,但仍然无法保存我的登录信息。我已经调试并看到它发送了 302 重定向并且我的登录成功。我相信。然后我将它发送到下一页,但保留从登录响应中获得的 cookie。但我仍然注销。除了网址和登录信息之外,这是我的代码。我已经验证了我的 POST 参数。我先请求会话 cookie,然后登录,然后进入重定向页面。非常感谢所有帮助,这是一个非常令人头疼的问题。

    HttpWebRequest GetRequest(string Site, CookieContainer Cookies, string SendType)
    {

        HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
        request.CookieContainer = Cookies; // Assign it some cookies 
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = SendType; 
        return request; 
    }

    private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
    {

        string formParams = string.Format("login={0}&password={1}", username, password);

        // cookies to use for multiple requests
        var cookies = new CookieContainer(); // Create cookies!



        var request= GetRequest(loginPage, cookies, "POST");


        //Send params off 
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);

        using (Stream loginStream = request.GetRequestStream())
        {
            loginStream.Write(bytes, 0, bytes.Length);
        }



        request.GetResponse().Dispose(); // removed some code here, no need to read response manually



        request= GetRequest(redirectPage, cookies, "GET");



        using (WebResponse getResponse = request.GetResponse())
        {
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                var result = sr.ReadToEnd();//Read logged in webpage
                return  Convert.ToString(result); 
            }

        }


        return "<Html></html>"; //Return blank page in case the using above didn't work correctly. 



    }

以下代码已重构并且可以正常工作。我遵循了以下 KoBE 的建议,但它仍然无法正常工作。问题原来是针对框架 4.5.2 我针对 4.0 和以下功能工作。只需向 GetLoggedInPage 发送您的用户名、密码、登录 url 和目标 url,它就会返回一个字符串。我将把它变成一个类并使用它。

记得保存你的 cookie 人!

void WriteParams(string Params, HttpWebRequest webrequestStream)
{
    byte[] bytes = Encoding.ASCII.GetBytes(Params);


    using (Stream requestStream = webrequestStream.GetRequestStream())
    {
        requestStream.Write(bytes, 0, bytes.Length);
    }


}


 HttpWebRequest GetRequest(string Site, ref CookieContainer Cookies, string SendType)
{

    HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
    request.CookieContainer = Cookies; // Assign it some cookies 
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = SendType; 
    return request; 
}

private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
{

    string formParams = string.Format("login={0}&password={1}", username, password);

    // cookies to use for multiple requests
    var cookies = new CookieContainer(); // Create cookies!



    HttpWebRequest request= GetRequest(loginPage, ref cookies, "POST");


    //Send params off 

    WriteParams(formParams, request);


    request.GetResponse();// .Dispose(); // removed some code here, no need to read response manually



    request= GetRequest(redirectPage, ref cookies, "GET");



    using (WebResponse getResponse = request.GetResponse())
    {
        using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
        {
            var result = sr.ReadToEnd();//Read logged in webpage
            return  Convert.ToString(result); 
        }

    }


    return "<Html></html>"; //Return blank page in case the using above didn't work correctly. 



}

【问题讨论】:

    标签: c# session cookies


    【解决方案1】:

    编辑:我终于查看了您的代码。看起来您只是缺少用户代理。在底部查看您修改后的代码。

    首先,我要改变的是:

    var cookies = new CookieContainer(); // Create cookies!
    TheRequest.CookieContainer = new CookieContainer();
    

    到这里:

    var cookies = new CookieContainer(); // Create cookies!
    TheRequest.CookieContainer = cookies;
    

    这将阻止您需要:

    foreach (Cookie c in TheResponse.Cookies)//Get response cookie
    {
        cookies.Add(c);
    }
    TheRequest.CookieContainer = cookies;
    

    不需要创建两个cookie容器,然后从一个复制到另一个,只需将原始设置为复制的版本。

    我不确定,但这可以解决您的问题,具体取决于 CookieContainer 在后台实际执行的 Uri 特定 cookie 的工作量,或者您有什么。

    https://www.pucatrade.com/dashboard 是您使用的网址吗?另外,您为什么要尝试多次登录?

    修改后的代码


    string username = "your-user";
    string pass = "your-pass";
    string loginPage = "https://pucatrade.com/login";
    string redirectPage = "https://pucatrade.com/dashboard";
    string formParams = string.Format("login={0}&password={1}", username, pass);
    
    // cookies to use for multiple requests
    var cookies = new CookieContainer(); // Create cookies!
    
    var request = WebRequest.Create(loginPage) as HttpWebRequest;
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
    request.CookieContainer = cookies; // Assign it some cookies 
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    byte[] bytes = Encoding.ASCII.GetBytes(formParams);
    request.ContentLength = bytes.Length;
    using (Stream loginStream = request.GetRequestStream())
    {
        loginStream.Write(bytes, 0, bytes.Length);
    }
    
    request.GetResponse().Dispose(); // removed some code here, no need to read response manually
    
    request = WebRequest.Create(redirectPage) as HttpWebRequest; //we know we get redirected too here, so just go there. 
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
    request.CookieContainer = cookies; // Assign it some cookies 
    request.Method = "GET";
    
    using (WebResponse getResponse = request.GetResponse())
    {
        using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
        {
            var result = sr.ReadToEnd();//Read logged in webpage
        }
    }
    

    【讨论】:

    • 我应用了您的修复程序,但仍然出现未登录屏幕。至于多次,我读到您应该首先发送带有凭据的 GET,以获取会话 cookie 并添加它。我把那个代码拿出来更新了。它从登录页面到该页面。我需要处理重定向吗?
    • 看来您缺少用户代理。另外,取出那个for循环。你不再需要它了。我在上面提供了一个工作示例。
    • 它仍然有点笨拙,可以使用一些重构,但我觉得这超出了你的问题范围。
    • 添加了你的修复,也重构了升技。同样的问题。我可以使用凭据手动登录。但不是程序性的。我确实在您更新的代码中注意到 cookie 容器正在接收任何 cookie。只是其他容器被分配了“全局”空容器。非常感谢您的所有帮助。
    • 在创建请求时为 CookieContainer 分配 cookie。您不必担心设置它们,HttpRequest 类会为您处理。此外,我测试了答案中的确切代码,并且能够以编程方式登录。所以,你仍然缺少一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多