Неожиданное поведение в объекте CookieContainer при указании версии в ответе Set-Cookie C # .NET 2.0-4.0

Пишу приложение для входа на live.com. Я уже успешно реализовал это с помощью элемента управления WebBrowser, но теперь я пытаюсь сделать это с помощью безголового браузера. Я бы просто использовал SimpleBrowser, но мне нужна поддержка JavaScript. Поэтому я пытаюсь сделать это, расширив класс WebClient для поддержки файлов cookie. Сначала я думал, что это моя проблема, но я провел простой тестовый пример с объектами HttpWebRequest и HttpWebResponse, чтобы посмотреть, как выглядят мои файлы cookie, и получил тот же результат.

Проблема, похоже, связана с "version = 1", переданным в заголовке ответа Set-Cookie для live.com. В моем тестовом примере я запустил тот же код для twitter.com и login.live.com.

private void printCookies(string url)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); ;
    CookieContainer cc = new CookieContainer();
    req.CookieContainer = cc;
    HttpWebResponse res = (HttpWebResponse)req.GetResponse();            
    if (res.Cookies != null && res.Cookies.Count != 0)
    {
        Console.WriteLine("--------" + url + "--------");
        foreach (Cookie c in res.Cookies)
        {
            Console.WriteLine(c.ToString());
        }                
    }
    res.Close();            
}

Вывод:

--------https://login.live.com--------
$Version=1; MSPRequ=lt=1309969317&co=1&id=251248; $Path=/
--------http://twitter.com--------
k=209.43.1.25.1309969317382762
guest_id=v1%3A130996931741841563
auth_token= _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCC5%252BQQAxAToHaWQiJWNmZWM0ZTAyNmEyMWYx%250ANDg0MTM3YzJhZGRiZTljYmI2IgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--e08b33494bd0d4d688020d4c875f69a1192e2a84

Если я посмотрю на значение "Set-Cookie" в заголовках ответа соответствующего URL-адреса, то я вижу следующее (получено из Fiddler):

login.live.com
Set-Cookie: MSPRequ=lt=1309969336&co=1&id=251248; path=/;version=1
Set-Cookie: MSPOK=$uuid-9f7c6cd2-5acc-497f-a634-079d78cb6e7f; domain=login.live.com;path=/;version=1

twitter.com
Set-Cookie: k=209.43.1.25.1309969337110139; path=/; expires=Wed, 13-Jul-11 16:22:17 GMT; domain=.twitter.com
Set-Cookie: guest_id=v1%3A130996933711260520; domain=.twitter.com; path=/; expires=Sat, 06 Jul 2013 04:22:17 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCBrLQQAxAToHaWQiJTZhZTNjNmRmNjlhNWJl%250AMWEyMzkyZjNjNWQ4MjRmNDAxIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--2af4da7176dc0ee77c8379bc31a85c0301823e2d; domain=.twitter.com; path=/; HttpOnly

Таким образом, login.live.com захватывает только один из файлов cookie, а затем сохраняет версию и путь отдельно. Запрос twitter.com работает должным образом (не знаю, почему отправляется дубликат auth_token, но CookieContainer справляется с этим хорошо).

Это ожидаемое поведение? Кажется, что IE, Firefox и Chrome просто игнорируют «version = 1» (из того, что я могу сказать в Fiddler). Я мог бы переопределить метод GetWebResponse в моем настраиваемом классе WebClient, чтобы удалить «version = 1» из значения «Set-Cookie» в заголовке ответа, но я надеялся, что есть более очевидное решение, которое мне не хватает. Возможно, это не ошибка «версия = 1», но я не вижу других разительных различий, кроме той, что есть между двумя моими тестовыми примерами.

Спасибо,
Аарон Рэй


person Aaron Ray    schedule 06.07.2011    source источник
comment
По какой причине вы не используете компонент WebBrowser, поскольку, похоже, при подключении к live.com, как это кажется из скрипта, происходят грубые операции (требующие много времени при обработке с помощью HttpWebRequest и HttpWebResponse)?   -  person cgon    schedule 08.07.2011
comment
Объект WebBrowser - это элемент управления Forms. По сути, это просто оболочка для MSHTML. Я хочу реализовать безголовое решение, которое не беспокоится о рендеринге HTML и просто захватывает / отправляет необработанные данные. Я также пытаюсь реализовать его в WPF, и мне не нравится WPF WebBrowser, а также Forms WebBrowser, поэтому я запускаю его на хосте Forms.   -  person Aaron Ray    schedule 08.07.2011
comment
Задержка, которую вы видите, вероятно, связана с прокси-сервером в настройке HttpRequest.Proxy. При его отключении в Fiddler ничего не отображается, но скорость соединения увеличивается. Тем не менее, моя проблема в том, что это должно работать, но это не так. Похоже, существует внутренняя проблема с версией обработки CookieContainer или проблема с моей ее реализацией.   -  person Aaron Ray    schedule 08.07.2011


Ответы (1)


Чтобы удалить часть версии, вы можете использовать такой код:

foreach (Cookie c in cookieContainer.GetCookies(new Uri(uri)))
{
  c.Version = 0;
}
person danmiser    schedule 30.01.2012
comment
Это удаляет версию, но по-прежнему обрезает cookie на пути. Мне нужна строка с GUID, а код не может ее получить. - person Aaron Ray; 30.01.2012