2017-03-10 59 views
0

这是我的代码。它是一次获取/设置/删除多个cookie。设置和删除(全部)工作正常,但我不能删除从CookieCollection只是过期的cookie。如何从CookieCollection中删除Cookie?

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using System.Web; 
using Newtonsoft.Json; 

namespace SetGetMultipleCookies 
{ 
    public partial class GetSetCookiesForm : Form 
    { 
     string readCookiesUrl = "http://test.dev/_test/cookies/readcookie.php"; 
     string setCookiesUrl = "http://test.dev/_test/cookies/setcookie.php"; 
     CookieContainer cookieHeader = new CookieContainer(); 
     CookieCollection cookie_collection = new CookieCollection(); 

     public GetSetCookiesForm() 
     { 
      InitializeComponent(); 
     } 

     private void getCookiesButton_Click(object sender, EventArgs e) 
     { 
      // begins variable for page content. 
      string pageSource; 
      // send url request to web page. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.readCookiesUrl); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       if (!each_cookie.Expired) 
       { 
        request.Headers.Add("Cookie", each_cookie.ToString()); 
       } else 
       { 
        // how to remove an expired cookie from cookie collection? 

       } 
      } 

      // read the page content 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       pageSource = sr.ReadToEnd(); 
      } 

      // display debug. 
      resultBox.Text = pageSource + "\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "; expires=" + each_cookie.Expires + "; path=" + each_cookie.Path + ";domain=" + each_cookie.Domain + "\r\n"; 
       if (each_cookie.Expired) 
       { 
        resultBox.Text += "cookie expired.\r\n"; 
       } 
      } 
     } 

     private void setCookiesButton_Click(object sender, EventArgs e) 
     { 
      // send url request to set cookie. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.setCookiesUrl); 
      request.Method = "GET"; 
      request.CookieContainer = this.cookieHeader; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // set cookies 
      this.cookie_collection = response.Cookies; 
      // debug 
      resultBox.Text = "Headers ==========\r\n"; 
      foreach (string each_header in response.Headers) 
      { 
       resultBox.Text += each_header + " = " + response.Headers[each_header] + "\r\n"; 
      } 
      resultBox.Text += "\r\nCookies (" + response.Cookies.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in response.Cookies) 
      { 
       resultBox.Text += each_cookie.ToString() + "\r\n"; 
       resultBox.Text += each_cookie.Name + "\r\n"; 
       resultBox.Text += each_cookie.Value + "\r\n"; 
       resultBox.Text += each_cookie.Expires + "\r\n"; 
       resultBox.Text += each_cookie.Path + "\r\n"; 
       resultBox.Text += each_cookie.Domain + "\r\n"; 
       resultBox.Text += each_cookie.Secure + "\r\n"; 
       resultBox.Text += each_cookie.HttpOnly + "\r\n"; 
       resultBox.Text += each_cookie.Expired + "\r\n"; 
       resultBox.Text += "\r\n"; 
      } 
      // get response body. 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String responseText = reader.ReadToEnd(); 
       // json decode 
       //LoginResponse responsej = JsonConvert.DeserializeObject<LoginResponse>(responseText); 
       // display debug. 
       resultBox.Text += "Response body ==========\r\n"; 
       resultBox.Text += responseText + "\r\n"; 
      } 
     } 

     private void removeCookiesButton_Click(object sender, EventArgs e) 
     { 
      this.cookieHeader = new CookieContainer(); 
      this.cookie_collection = new CookieCollection(); 

      resultBox.Text = "Logged out."; 
     } 
    } 
} 

getCookiesButton_Click的方法,我只是想从CookieCollection删除过期的饼干。怎么做? 如何从CookieCollection中删除过期的cookie?

enter image description here

在红色矩形线,即过期的饼干第一次当点击获取饼干它与过期的报告,该报告是正确的,但第二次就应该完全从CookieCollection移除显示有。

+0

无论如何你想做什么?为什么要手动完成所有操作?通常情况下,这不是......这些课程旨在在幕后一起工作。有这个CookieContainer类往往是你需要的一切 - 它处理缓存饼干和处理删除过期的和处理各种cookie的正确范围,以核实网址。您需要“处理Cookie”的所有内容是创建CookieContainer和WebClient实例,将其设置为使用cookie容器,然后使用webclient创建请求。它甚至会遵循重定向,并为你做所有无聊的事情。 – quetzalcoatl

+1

〜> http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class等? – quetzalcoatl

+0

@quetzalcoatl我想创建客户端程序,使用Rest API与Web服务器建立连接。它使用许多cookie,如登录,一些设置值。我是VC#和C#语言的新手,所以我对这些并不熟悉,不知道哪一个是使用cookie处理的最佳方式。这方面也没有太多的例子和教程。 反正谢谢你。我会尽快尝试。 – vee

回答

0

找到固定。

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using Newtonsoft.Json; 

namespace SetGetMultipleCookies 
{ 
    public partial class GetSetCookiesForm : Form 
    { 
     string readCookiesUrl = "http://test.dev/_test/cookies/readcookie.php"; 
     string setCookiesUrl = "http://test.dev/_test/cookies/setcookie.php"; 
     CookieContainer cookie_container = new CookieContainer(); 
     CookieCollection cookie_collection = new CookieCollection(); 


     public GetSetCookiesForm() 
     { 
      InitializeComponent(); 
     } 


     private void getCookiesButton_Click(object sender, EventArgs e) 
     { 
      // begins variable for page content. 
      string pageSource; 
      // send url request to web page. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.readCookiesUrl); 
      request.CookieContainer = this.cookie_container; 
      request.UserAgent = "My C# App"; 

      // get response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // reset cookie collection. 
      this.cookie_collection = new CookieCollection(); 
      // loop through cookie container to set only non-expired to cookie collection. 
      var cookies_container = this.cookie_container.GetCookies(new Uri(this.readCookiesUrl)); 
      foreach (Cookie each_cookie in cookies_container) 
      { 
       if (!each_cookie.Expired) 
       { 
        this.cookie_collection.Add(each_cookie); 
       } 

      } 

      // read the page content 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       pageSource = sr.ReadToEnd(); 
      } 

      // display debug. 
      resultBox.Text = pageSource.Replace("\n", "\r\n") + "\r\n"; 
      resultBox.Text += "\r\nCookies (" + this.cookie_collection.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "; expires=" + each_cookie.Expires + "; path=" + each_cookie.Path + ";domain=" + each_cookie.Domain + "\r\n"; 
       if (each_cookie.Expired) 
       { 
        resultBox.Text += "cookie expired.\r\n"; 
       } 
      } 

      // clear memory. 
      pageSource = default(String); 
      request = default(HttpWebRequest); 
      response = default(HttpWebResponse); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 


     private void setCookiesButton_Click(object sender, EventArgs e) 
     { 
      // send url request to set cookie. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.setCookiesUrl); 
      request.Method = "GET"; 
      request.CookieContainer = this.cookie_container; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.UserAgent = "My C# App"; 
      // get response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // set cookies collection 
      this.cookie_collection = response.Cookies; 

      // debug 
      resultBox.Text = "Headers ==========\r\n"; 
      foreach (string each_header in response.Headers) 
      { 
       resultBox.Text += each_header + " = " + response.Headers[each_header].Replace("\n", "\r\n").Replace("\r", "\r\n") + "\r\n"; 
      } 
      resultBox.Text += "\r\nCookies (" + this.cookie_collection.Count + ") ==========\r\n"; 
      foreach (Cookie each_cookie in this.cookie_collection) 
      { 
       resultBox.Text += each_cookie.ToString() + "\r\n"; 
       resultBox.Text += each_cookie.Name + "\r\n"; 
       resultBox.Text += each_cookie.Value + "\r\n"; 
       resultBox.Text += each_cookie.Expires + "\r\n"; 
       resultBox.Text += each_cookie.Path + "\r\n"; 
       resultBox.Text += each_cookie.Domain + "\r\n"; 
       resultBox.Text += each_cookie.Secure + "\r\n"; 
       resultBox.Text += each_cookie.HttpOnly + "\r\n"; 
       resultBox.Text += each_cookie.Expired + "\r\n"; 
       resultBox.Text += "\r\n"; 
       // add cookie to cookiecontainer 
       this.cookie_container.Add(each_cookie); 
      } 
      // get response body. 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String responseText = reader.ReadToEnd(); 
       // json decode 
       //LoginResponse responsej = JsonConvert.DeserializeObject<LoginResponse>(responseText);// too lazy to do this. 
       // display debug. 
       resultBox.Text += "Response body ==========\r\n"; 
       resultBox.Text += responseText + "\r\n"; 
       // clear memory. 
       reader = default(StreamReader); 
       responseText = default(String); 
      } 

      // clear memory. 
      request = default(HttpWebRequest); 
      response = default(HttpWebResponse); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 


     private void removeCookiesButton_Click(object sender, EventArgs e) 
     { 
      this.cookie_container = new CookieContainer(); 
      this.cookie_collection = new CookieCollection(); 

      resultBox.Text = "Logged out."; 

      // clear memory. 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
    } 
} 
0

Cookie只能通过为每个设置Expiry date来清除。

此外,您可以尝试Clear()方法清除Cookies

// clear cookies server side 
HttpContext.Current.Request.Cookies.Clear(); 

如果你想删除一个Cookie它已经知道你的名字,你可以设置Expires时间等给出下面这样,当时间到达自动Cookie将被删除。

if (Request.Cookies["cookiename"] != null) 
{ 
    Response.Cookies["cookiename"].Expires = DateTime.Now.AddDays(-1); 
} 

有时Session相关Cookies不会自动删除。对于您可以试试下面一个

HttpContext.Current.Session.Abandon(); 
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 

你可以写一个单独的方法,这样做也喜欢下面

private void ExpireAllCookies() 
{ 
    if (HttpContext.Current != null) 
    { 
     int cookieCount = HttpContext.Current.Request.Cookies.Count; 
     for (var i = 0; i < cookieCount; i++) 
     { 
      var cookie = HttpContext.Current.Request.Cookies[i]; 
      if (cookie != null) 
      { 
       var cookieName = cookie.Name; 
       var expiredCookie = new HttpCookie(cookieName) {Expires = DateTime.Now.AddDays(-1)}; 
       HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it 
      } 
     } 

     // clear cookies server side 
     HttpContext.Current.Request.Cookies.Clear(); 
    } 
} 
+0

不,我的意思是“过期的cookie”(每个过期的cookie)。请在getCookiesButton_Click方法中查找NOT removeCookiesButton_Click – vee

+0

.Expires或.Expired没有删除,它只是告诉程序已过期。当我点击时再次获取cookies我希望它从收藏中消失,只有可用的非过期。 – vee

+0

我刚更新了完整的细节问题。它是Windows窗体而不是Web应用程序(asp.net)和那些.Expires ,.过期,甚至HttpContext都不起作用。它只需要从列表中删除像删除数组键,但我不知道如何,因为我是新手。 – vee