0

HttpWebRequest を使用して Web サイトからデータをダウンロードしていますが、Cookie に関連するバグに気付きました。domain.com からデータを取得し、その Web サイトが Cookie を送信する www.domain.com にリダイレクトする場合、その Cookie は domain.com と共有されません。これにより、アプリでいくつかの厄介なバグが発生します。

www.domain.com が domain.com と同じ Web サイトである必要がないことはわかっていますが、この場合、関連するリスクよりもメリットの方が大きいと思います。

domain.com から www.domain.com へ、またはその逆に Cookie を自動的に適用する簡単な方法はありますか?

4

2 に答える 2

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 に答える
0

Cookie コンテンツをセッション オブジェクトに保存し、セッション オブジェクトを識別するセッション キーを使用して新しいページを呼び出します。次に、セッションを検索し、www.domain.com のページを配信するときに新しい Cookie を設定します。

于 2012-03-27T09:17:03.137 に答える