大家好,我用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值呢?谢谢大家!
在代码中你是如何获取 Cookie 的?
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:
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: 嗯,确实是。请问为什么获取的cookie数量不一致呢,如何才能使CookieContainer.Count 也获取3个值呢?谢谢啦
@baoerzhang: HttpWebResponse 的 Cookies 属性所填充的 Cookie 和 HttpWebResponse 的 Headers 中填充的 Cookie 是从原始的响应中直接解析出来的,也就是相应里有啥,这里就有啥,所以是 3;而 HttpWebRequest 的 CookieContainer 中的 Cookie 是对前面的 Cookies 中的 Cookie 经过一些分类(比如域名分类)和判断(比如是否过期)后才填充的,所以它的数量不一定同原始的 Cookie 数量相同,那么你刚好就在这里遇到这种情况了。
@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: 应该是过期了吧,这个 17-Dec-43,应该是 12月17日,1900+43 = 1943年。
@Launcher: 感谢大牛
估计不是获取不全,而且百度根本就没有输出给你,建议你把fiddler里的http头信息全部放到HttpClient里再请求试一下。
我做的是一个控制台程序,先打开fiddler,再运行控制台,fiddler捕获到了控制台程序对百度的请求,通过fiddler查看返回的cookie是3个,但我控制台里只获取到两个。跟断点了,确实是只获取到两个
@baoerzhang: 你是怎么取的cookie呢?
我怎么看百度首页就有11个cookie呢
不是你获取的不全,而是百度服务器判断不是通过浏览器访问的人家域名,而是其它方式获取的请求,也就是判断你agent不正常,就只给你生成了一部分cookie
我做的是一个控制台程序,先打开fiddler,再运行控制台,fiddler捕获到了控制台程序对百度的请求,通过fiddler查看返回的cookie是3个,但我控制台里只获取到两个。跟断点了,确实是只获取到两个
@baoerzhang: 你直接用浏览器访问看看有几个
@dolphinX: 直接用浏览器访问的话,浏览器会提交我本机的BAIDUID cookie,那返回回来的设置cookie就没有BAIDUID了。
现在问题是为什么我控制台程序模拟get请求百度,返回回来的是包含BAIDUID(可能是百度随机分配的ID值)cookie在内的3个cookie。而用HttpClient+HttpClientHandler 只获取到2个,BAIDUID这个cookie获取不到呢?是因为这个cookie是失效的所以获取时就忽略了呢?