c# - CookieContainer 错误?

标签 c# cookiecontainer

我对 CookieContainer 如何处理域感到困惑,所以我创建了这个测试。 此测试显示 cookieContainer 不会为“example.com”返回任何 cookie,但根据 RFC,它应该至少返回 2 个 cookie。

这不是一个错误吗?

如何让它发挥作用?

这里是关于这个错误的讨论:

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c4edc965-2dc2-4724-8f08-68815cf1dce6

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    CookieContainer getContainer()
    {
        CookieContainer result = new CookieContainer();

        Uri uri = new Uri("http://sub.example.com");
        string cookieH = @"Test1=val; domain=sub.example.com; path=/";
        result.SetCookies(uri, cookieH);

        cookieH = @"Test2=val; domain=.example.com; path=/";
        result.SetCookies(uri, cookieH);

        cookieH = @"Test3=val; domain=example.com; path=/";
        result.SetCookies(uri, cookieH);

        return result;
    }

    void Test()
    {
        CookieContainer cookie = getContainer();
        lblResult.Text += "<br>Total cookies count: " + cookie.Count + " &nbsp;&nbsp; expected: 3";

        Uri uri = new Uri("http://sub.example.com");
        CookieCollection coll = cookie.GetCookies(uri);
        lblResult.Text += "<br>For " + uri + " Cookie count: " + coll.Count + " &nbsp;&nbsp; expected: 2";

        uri = new Uri("http://other.example.com");
        coll = cookie.GetCookies(uri);
        lblResult.Text += "<br>For " + uri + " Cookie count: " + coll.Count + " &nbsp;&nbsp; expected: 2";

        uri = new Uri("http://example.com");
        coll = cookie.GetCookies(uri);
        lblResult.Text += "<br>For " + uri + " Cookie count: " + coll.Count + " &nbsp;&nbsp; expected: 2";

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Test();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>CookieContainer Test Page</title>
</head>
<body>
    <form id="frmTest" runat="server">
    <asp:Label ID="lblResult" EnableViewState="false" runat="server"></asp:Label>
    </form>
</body>
</html>

最佳答案

我刚刚找到了此错误的修复程序并在此处进行了讨论: http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

解决方法如下:

  1. 不要使用 .Add(Cookie),仅使用 .Add(Uri, Cookie) 方法。
  2. 每次将 cookie 添加到容器时调用 BugFix_CookieDomain 或者 在您使用 .GetCookie 之前或系统使用容器之前。

    private void BugFix_CookieDomain(CookieContainer cookieContainer)
    {
        System.Type _ContainerType = typeof(CookieContainer);
        Hashtable table = (Hashtable)_ContainerType.InvokeMember("m_domainTable",
                                   System.Reflection.BindingFlags.NonPublic |
                                   System.Reflection.BindingFlags.GetField |
                                   System.Reflection.BindingFlags.Instance,
                                   null,
                                   cookieContainer,
                                   new object[] { });
        ArrayList keys = new ArrayList(table.Keys);
        foreach (string keyObj in keys)
        {
            string key = (keyObj as string);
            if (key[0] == '.')
            {
                string newKey = key.Remove(0, 1);
                table[newKey] = table[keyObj];
            }
        }
    }
    

关于c# - CookieContainer 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1047669/

相关文章:

c# - EF 上下文的大小

c# - 使用 Linq 遍历层次结构表

c# - 使用相同的 CookieContainer 浏览

c# - 严重的 CookieContainer 错误?

c# - 从代码隐藏中将图标类添加到 HTML5 按钮

c# - 具有初始容量的 List<T> 内存分配

c# - 我如何检查并终止我的应用程序的另一个实例?

c# - 向Web服务端口客户端添加cookie

asp.net - 重用 CookieContainer 时如何确定 session 超时