以下代码创建100个cookie,然后通过回发枚举它们。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
for (int i = 0; i < 100; i++)
{
HttpCookie cookie = new HttpCookie("cookie num." + i.ToString());
cookie["Cookie"] = i.ToString() + "th cookie, anyone?";
cookie.Expires = DateTime.Now.AddMonths(1);
Response.Cookies.Add(cookie);
}
int i1 = 0;
Session["i"] = i1;
}
if (IsPostBack)
{
int i = (int)Session["i"];
HttpCookie cookie= Request.Cookies["Cookie num." + i.ToString()];
Label1.Text = cookie["Cookie"];
Session["i"] = ++i;
}
}
Q1 - 但是当使用Firefox时,应用程序只能设法在报告对象引用未设置为对象实例之前通过前20个(最多40个)cookie,而不是能够枚举所有100个cookie exeception:
Q2 - 当我通过IE请求此页面时,我将始终对象引用未设置为对象异常的实例(BTW - 我已检查并且IE确实设法存储了所有100个cookie在第一个回发上的单个文件中。
感谢名单
编辑:
但以下链接适用于IE,而Firefox则不保存所有Cookie。使用IE,代码无法通过任何cookie进行枚举。因此,如果我至少能够通过前20个cookie(在IE中)进行枚举,那么上述答案将是有效的,我不是
2.编辑:
规范不保证浏览器在存储空间不足时必须保留哪些cookie,因此浏览器可以自由地表达他们喜欢的行为,并且您应该期待不同的行为。更重要的是,在您的示例中,所有Cookie都设置在单个响应的标头中。 HTTP标头不是有序的,因此无法保证它们将首先按任何特定顺序进行处理。
“处理”到底是什么意思?
thanx帮助我
答案 0 :(得分:12)
You can't rely on being able to set more than 20 cookies per hostname.
ETA:
但以下链接适用于IE,而Firefox则不保存所有Cookie。
是的,但文章引用了RFC2109,它也适用于Firefox。
至于当出现错误时,这将取决于浏览器决定保留哪些cookie。如果它设置了前20个cookie,你将在cookie20中出错;如果它丢弃了早期的cookie以便为新的cookie腾出空间,那么你将只剩下cookie80-cookie99,并且尝试访问cookie0将会出错。
规范不保证浏览器在存储空间不足时必须保留哪些cookie,因此浏览器可以自由地表达他们喜欢的行为,并且您应该期待不同的行为。更重要的是,在您的示例中,所有Cookie都设置在单个响应的标头中。 HTTP标头不是有序的,因此无法保证它们将首先按任何特定顺序进行处理。
RFC2109的限制通常并不能完全反映现实,但每个浏览器都有自己的cookie限制,您通常应该尽量将cookie数据保持在最低限度。
答案 1 :(得分:0)
Internet Explorer拒绝您的Cookie可能有多种原因(例如安全设置等)
此外,所有浏览器都限制了他们接受的cookie数量(20到50之间),此外cookie字符串的总长度有限(例如10 kB)。
因此,没有机会在任何浏览器中设置100个cookie。
您可以从其中一位Internet Explorer程序员处找到所有这些问题的非常详细的答案: http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx