0

我正在使用 HttpWebRequest 从网站下载数据,我注意到一个与 cookie 相关的错误。当您从 domain.com 获取数据并且该网站重定向到发送 cookie 的 www.domain.com 时,该 cookie 不会与 domain.com 共享。这会在我的应用程序中导致一些讨厌的错误。

我知道 www.domain.com 不需要与 domain.com 相同的网站,但我相信在这种情况下,好处将超过任何相关的风险。

有什么简单的方法可以自动将 cookie 从 domain.com 应用到 www.domain.com,反之亦然?

4

2 回答 2

0

将您的 cookie 内容存储在会话对象中,并使用标识会话对象的会话密钥调用新页面。然后在传递 www.domain.com 的页面时查找会话并设置一个新的 cookie。

于 2012-03-27T09:17:03.137 回答
0

这是我所做的:

    class DomainComparer : StringComparer
    {
        public override int Compare(string x, string y)
        {
            if (x == null || y == null)
            {
                return StringComparer.OrdinalIgnoreCase.Compare(x, y);
            }
            if (x.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
            {
                x = x.Substring(4);
            }
            if (y.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
            {
                y = y.Substring(4);
            }
            return StringComparer.OrdinalIgnoreCase.Compare(x, y);
        }

        public override bool Equals(string x, string y)
        {
            return Compare(x, y) == 0;
        }

        public override int GetHashCode(string obj)
        {
            if (obj.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
            {
                obj = obj.Substring(4);
            }
            return StringComparer.OrdinalIgnoreCase.GetHashCode(obj);
        }
    }

    /// <summary>
    /// this is a hackfix for microsoft bug, where cookies are not shared between www.domain.com and domain.com
    /// </summary>
    /// <param name="cc"></param>
    static void ImproveCookieContainer(CookieContainer cc)
    {
        Hashtable table = (Hashtable)cc.GetType().InvokeMember(
            "m_domainTable",
            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance,
            null, cc, new object[] { });
        var comparerPreperty = table.GetType().GetField("_keycomparer", 
            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance);
        if (comparerPreperty != null)
        {
            comparerPreperty.SetValue(table, new DomainComparer());
        }
    }
于 2012-03-27T14:17:48.853 回答