这是我的代码。它是一次获取/设置/删除多个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?
在红色矩形线,即过期的饼干第一次当点击获取饼干它与过期的报告,该报告是正确的,但第二次就应该完全从CookieCollection
移除显示有。
无论如何你想做什么?为什么要手动完成所有操作?通常情况下,这不是......这些课程旨在在幕后一起工作。有这个CookieContainer类往往是你需要的一切 - 它处理缓存饼干和处理删除过期的和处理各种cookie的正确范围,以核实网址。您需要“处理Cookie”的所有内容是创建CookieContainer和WebClient实例,将其设置为使用cookie容器,然后使用webclient创建请求。它甚至会遵循重定向,并为你做所有无聊的事情。 – quetzalcoatl
〜> http://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class等? – quetzalcoatl
@quetzalcoatl我想创建客户端程序,使用Rest API与Web服务器建立连接。它使用许多cookie,如登录,一些设置值。我是VC#和C#语言的新手,所以我对这些并不熟悉,不知道哪一个是使用cookie处理的最佳方式。这方面也没有太多的例子和教程。 反正谢谢你。我会尽快尝试。 – vee