Как поделиться файлами cookie между доменами.com и www.domain.com? - PullRequest
0 голосов
/ 27 марта 2012

Я использую HttpWebRequest для загрузки данных с веб-сайта, и я заметил ошибку, связанную с файлами cookie.Когда вы получаете данные от domain.com, и этот веб-сайт перенаправляет на www.domain.com, который отправляет cookie, этот cookie не передается domain.com.Это вызывает некоторые неприятные ошибки в моем приложении.

Я знаю, что www.domain.com не нужен тот же веб-сайт, что и domain.com, но я полагаю, что в этом случае выгоды перевесят любые связанные с этим риски.

Есть ли какие-либо легкиеспособ автоматически применить куки с domain.com к www.domain.com и наоборот?

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Вот что я сделал:

    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());
        }
    }
0 голосов
/ 27 марта 2012

Сохраните содержимое cookie в объекте сеанса и вызовите новую страницу с ключом сеанса, идентифицирующим ваш объект сеанса. Затем найдите сеанс и установите новый файл cookie при доставке страницы для www.domain.com.

...