Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在domain.com和www.domain.com之间共享cookie?_C#_Cookies_Httpwebrequest_Cookiecontainer - Fatal编程技术网

C# 如何在domain.com和www.domain.com之间共享cookie?

C# 如何在domain.com和www.domain.com之间共享cookie?,c#,cookies,httpwebrequest,cookiecontainer,C#,Cookies,Httpwebrequest,Cookiecontainer,我正在使用HttpWebRequest从网站下载数据,我注意到一个与cookie相关的bug。 当您从domain.com获取数据时,该网站会重定向到www.domain.com,该网站会发送一个cookie,该cookie不会与domain.com共享。这会在我的应用程序中导致一些讨厌的错误 我知道www.domain.com与domain.com不一定是同一个网站,但我相信在这种情况下,好处将超过任何相关风险 有没有简单的方法可以自动将cookie从domain.com应用到www.doma

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

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


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

将cookie内容存储在会话对象中,并使用识别会话对象的会话密钥调用新页面。然后在为www.domain.com交付页面时,查找会话并设置新cookie。

以下是我所做的:

    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());
        }
    }
类域比较器:StringComparer
{
公共覆盖整型比较(字符串x、字符串y)
{
如果(x==null | | y==null)
{
返回StringComparer.OrdinalIgnoreCase.Compare(x,y);
}
if(x.StartsWith(“www.”,StringComparison.OrdinalIgnoreCase))
{
x=x.子串(4);
}
if(y.StartsWith(“www.”,StringComparison.OrdinalIgnoreCase))
{
y=y.子串(4);
}
返回StringComparer.OrdinalIgnoreCase.Compare(x,y);
}
公共覆盖布尔等于(字符串x、字符串y)
{
返回比较(x,y)==0;
}
公共覆盖int GetHashCode(字符串obj)
{
if(obj.StartsWith(“www.”,StringComparison.OrdinalIgnoreCase))
{
obj=obj.子串(4);
}
返回StringComparer.OrdinalIgnoreCase.GetHashCode(obj);
}
}
/// 
///这是一个针对microsoft bug的修复程序,其中cookie在www.domain.com和domain.com之间不共享
/// 
/// 
静态空隙改善CookieContainer(CookieContainer cc)
{
Hashtable=(Hashtable)cc.GetType().InvokeMember(
“m_可维护”,
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance,
null,cc,新对象[]{});
var comparerpreserty=table.GetType().GetField(“\u keycomparer”,
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance);
if(comparerpreserty!=null)
{
SetValue(表,newdomaincomparer());
}
}

domain.com是您的域名吗?如果是,那么您也可以修改cookie以处理子域。