首页 新闻 搜索 专区 学院

HttpClient 获取cookie 不全

0
悬赏园豆:50 [已解决问题] 解决于 2013-12-17 15:28

大家好,我用C# HttpClient+HttpClientHandler 模拟get请求百度成功后,获取到了两个cookie值:

H_PS_PSSID=4461_4579_1447_4404_4261_4488

BDSVRTM=1

但是用fiddler 跟踪到返回的是3个cookie值,fiddler多的一个是:BAIDUID=1092C04D469CA561F589EEF4DEA6EC30:FG=1; expires=Mon, 16-Dec-43 11:40:42 GMT; path=/; domain=.baidu.com

请问,为什么我获取到的会少一个呢?又如何获取BAIDUID这个cookie值呢?谢谢大家!

baoerzhang的主页 baoerzhang | 初学一级 | 园豆:86
提问于:2013-12-16 19:44
< >
分享
最佳答案
2

在代码中你是如何获取 Cookie 的?

收获园豆:40
Launcher | 高人七级 |园豆:45045 | 2013-12-17 09:17

            HttpClientHandler handler = new HttpClientHandler();
            handler.UseCookies = true;
            var uri = new Uri("http://www.baidu.com");
           
            //handler.CookieContainer.SetCookies(uri, "aas=test");
            HttpClient client = new HttpClient(handler);


            var result =  client.GetStringAsync(uri);

            Console.WriteLine(result.Result);
            var getCookies = handler.CookieContainer.GetCookies(uri);
            Console.WriteLine("获取到的cookie数量:" + getCookies.Count);
            Console.WriteLine("获取到的cookie:");
            for (int i = 0; i < getCookies.Count;i++ )
            {
                Console.WriteLine(getCookies[i].Name + ":" + getCookies[i].Value);
            }

            Console.WriteLine("=".PadRight(50,'='));
            Console.WriteLine(handler.CookieContainer.PerDomainCapacity);
           
           
            Console.ReadKey();

 

上面就是全部代码

baoerzhang | 园豆:86 (初学一级) | 2013-12-17 11:11

@baoerzhang: 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com");
            request.CookieContainer = new CookieContainer();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();           

            // response.Cookies.Count 这个是 3
            // request.CookieContainer.Count 这个是 2

 

如果用 HttpClient 的话,HttpClientHandler 的 CookieContainer.Count 应该也是 2,如果要获取所有 3 个 Cookie 的话,使用 Task<HttpResponseMessage> GetAsync(Uri requestUri),然后从 HttpResponseMessage 的 Headers.GetValues("Set-Cookie") 可以取到所有 3 个。

 

 

Launcher | 园豆:45045 (高人七级) | 2013-12-17 11:34

@Launcher: 嗯,确实是。请问为什么获取的cookie数量不一致呢,如何才能使CookieContainer.Count 也获取3个值呢?谢谢啦

baoerzhang | 园豆:86 (初学一级) | 2013-12-17 14:26

@baoerzhang: HttpWebResponse 的 Cookies 属性所填充的 Cookie 和 HttpWebResponse  的 Headers 中填充的 Cookie 是从原始的响应中直接解析出来的,也就是相应里有啥,这里就有啥,所以是 3;而 HttpWebRequest 的 CookieContainer 中的 Cookie 是对前面的 Cookies 中的 Cookie 经过一些分类(比如域名分类)和判断(比如是否过期)后才填充的,所以它的数量不一定同原始的 Cookie 数量相同,那么你刚好就在这里遇到这种情况了。

Launcher | 园豆:45045 (高人七级) | 2013-12-17 14:52

@Launcher: BAIDUID=95370FFB9EA05E1B941AD0733FAE83B8:FG=1; expires=Tue, 17-Dec-43 07:06:57 GMT; path=/; domain=.baidu.com

有道理,上面这个cookie是我刚刚跟踪到的。它和我获取到的cookie属于同域(domain=.baidu.com),过期时间的话 应该是Tue, 17-Dec-43 07:06:57 GMT,这是代表过期了吗?非常感谢您的耐心解答!

baoerzhang | 园豆:86 (初学一级) | 2013-12-17 15:12

@baoerzhang: 应该是过期了吧,这个 17-Dec-43,应该是 12月17日,1900+43 = 1943年。

Launcher | 园豆:45045 (高人七级) | 2013-12-17 15:26

@Launcher: 感谢大牛

baoerzhang | 园豆:86 (初学一级) | 2013-12-17 15:30
其他回答(2)
0

估计不是获取不全,而且百度根本就没有输出给你,建议你把fiddler里的http头信息全部放到HttpClient里再请求试一下。

收获园豆:5
I,Robot | 园豆:9563 (大侠五级) | 2013-12-16 20:54

我做的是一个控制台程序,先打开fiddler,再运行控制台,fiddler捕获到了控制台程序对百度的请求,通过fiddler查看返回的cookie是3个,但我控制台里只获取到两个。跟断点了,确实是只获取到两个

支持(0) 反对(0) baoerzhang | 园豆:86 (初学一级) | 2013-12-16 22:36

@baoerzhang: 你是怎么取的cookie呢?

支持(0) 反对(0) I,Robot | 园豆:9563 (大侠五级) | 2013-12-17 12:40
0

我怎么看百度首页就有11个cookie呢

不是你获取的不全,而是百度服务器判断不是通过浏览器访问的人家域名,而是其它方式获取的请求,也就是判断你agent不正常,就只给你生成了一部分cookie

收获园豆:5
谦行 | 园豆:473 (菜鸟二级) | 2013-12-16 21:31

我做的是一个控制台程序,先打开fiddler,再运行控制台,fiddler捕获到了控制台程序对百度的请求,通过fiddler查看返回的cookie是3个,但我控制台里只获取到两个。跟断点了,确实是只获取到两个

支持(0) 反对(0) baoerzhang | 园豆:86 (初学一级) | 2013-12-16 22:37

@baoerzhang: 你直接用浏览器访问看看有几个

支持(0) 反对(0) 谦行 | 园豆:473 (菜鸟二级) | 2013-12-16 22:41

@dolphinX: 直接用浏览器访问的话,浏览器会提交我本机的BAIDUID cookie,那返回回来的设置cookie就没有BAIDUID了。

现在问题是为什么我控制台程序模拟get请求百度,返回回来的是包含BAIDUID(可能是百度随机分配的ID值)cookie在内的3个cookie。而用HttpClient+HttpClientHandler 只获取到2个,BAIDUID这个cookie获取不到呢?是因为这个cookie是失效的所以获取时就忽略了呢?

支持(0) 反对(0) baoerzhang | 园豆:86 (初学一级) | 2013-12-17 09:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册