在响应Set-Cookie 2.0-4.0中指定版本时,CookieContainer对象中的意外行为

本文关键字:CookieContainer 对象 意外 Set-Cookie 响应 版本 | 更新日期: 2023-09-27 18:01:27

我正在写一个登录live.com的应用程序。我已经用WebBrowser控件成功地实现了这一点,但我现在正试图用一个无头浏览器来实现这一点。我只会使用SimpleBrowser,但我需要JavaScript支持。因此,我试图通过扩展WebClient类来支持cookie来做到这一点。我最初认为这是我的问题,但我做了一个简单的测试用例与HttpWebRequest和HttpWebResponse对象,看看我的cookie看起来如何,我得到了相同的结果。

这个问题似乎是由于live.com的Set-Cookie响应头中传递的"version=1"。对于我的测试用例,我对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

如果我查看相应URL的响应头中的"Set-Cookie"值,这是我看到的(从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中可以看出)。我可以在我的自定义WebClient类中覆盖GetWebResponse方法,以从响应头的"Set-Cookie"值中删除"version=1",但我希望有一个更明显的解决方案,我错过了。这可能不是"version=1"的错误,但除了我的两个测试用例之间的差异之外,我没有看到任何其他显著的差异。

谢谢,
亚伦雷

在响应Set-Cookie 2.0-4.0中指定版本时,CookieContainer对象中的意外行为

要删除版本部分,可以使用如下代码:

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