在我获得异常之前,只能通过前20个左右的cookie进行枚举

时间:2009-04-05 21:10:18

标签: asp.net internet-explorer firefox


以下代码创建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帮助我

2 个答案:

答案 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