Неожиданное поведение в объекте CookieContainer, когда в ответе указана версия Set-Cookie C # .NET 2.0-4.0 - PullRequest
3 голосов
/ 06 июля 2011

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

Проблема, похоже, связана с тем, что "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» заголовка ответа, но я надеялся, что есть более очевидное решение, которое я пропускаю. Возможно, это не ошибка "version = 1", но я не вижу других разительных отличий, кроме различий между двумя моими тестами.

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

1 Ответ

2 голосов
/ 30 января 2012

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

foreach (Cookie c in cookieContainer.GetCookies(new Uri(uri)))
{
  c.Version = 0;
}
...