HttpWebRequest.CookieContainer与HttpWebResponse.Cookies的区别和联系

本文深入解析了HttpWebRequest.CookieContainer与HttpWebResponse.Cookies的区别,特别关注了它们在处理重定向时的行为差异,对于自动提交表单、保持Session或Cookie的页面爬取非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpWebRequest.CookieContainer与HttpWebResponse.Cookies的区别和联系

倒腾了老久,终于把这两者的关系给弄清出了。也不辜负我一个上午的时间~~~

关于 HttpWebRequest.CookieContainer与HttpWebResponse.Cookies的相关性质 MSDN和其他的博客上有很多,我就不再多说了,没有了解的自己去看看吧。

现在主要说说他们两个的区别。用过这两中属性的童鞋都发现,在大部分情况下它们两的内容是一模一样的,应为都是保存了和这次链接相关的Cookie,但是有一点不同:

HttpWebRequest.CookieContainer中包含的Cookie是与这次请求相关的所有Cookie,然而HttpWebResponse.Cookies却只包含这次请求中最后请求的URL相关的Cookie。

神马情况呢? 关键的是重定向,也就是说,当前如果访问的是Default1.aspx,并且Default1.aspx中会产生一个叫“Default1”的Cookie,并且会重定向到Default2.aspx页面。在Default2.aspx页面中同样会产生一个叫“Default2”的Cookie,并且会重定向到Default3.aspx页面。在Default3.aspx页面中会产生一个"Default3"的Cookie。到此为止整个请求就结束了。

此时HttpWebRequest.CookieContainer中包含了 3 个Cookie,分别为“Default1,Default2,Default3”,使用GetCookies方法

而此时HttpWebResponse.Cookies里面只包含了1个Cookie,那就是Default3。也就是最后一个页面所产生的Cookie。

这样,在自动提交表单来爬取,需要保持Session或者Cookie的页面时,需要将新产生的HttpWebResponse.Cookies中的Cookie保存起来,不能够直接的覆盖到以前的Cookie值了。并且要比对每次请求的HttpWebRequest.CookieContainer和HttpWebResponse.Cookies中的Cookie值,防止有遗漏,造成某些页面爬取不到。


private void btnModify_Click(object sender, EventArgs e) { string url = "http://192.168.1.104/Movies/Edit/5"; HttpWebRequest request = null; request = WebRequest.Create(url) as HttpWebRequest; request.Accept = "text/html, application/xhtml+xml, image/jxr, *"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586"; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Host = "192.168.1.104"; request.KeepAlive = true; request.Headers.Add("Pragma", "no-cache"); request.Headers.Add("Accept-Encoding", "gzip, deflate"); request.Headers.Add("Accept-Language", "zh-CN"); //没有下面两行代码 请求得不到相应 会出现错误提示:远程服务器返回错误: (500) 内部服务器错误。 request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(GV_CookieCollection); StringBuilder sb = new StringBuilder(); //__RequestVerificationToken 参数中没有它也是不行的,你可以试试 sb.Append("__RequestVerificationToken="); sb.Append(hidRequestVerificationToken); sb.Append("&ID=5"); sb.Append("&Title=速度激情4"); sb.Append("&ReleaseDate=2009-04-03"); sb.Append("&Genre=动作"); sb.Append("&Price=45.5"); byte[] b = new UTF8Encoding().GetBytes(sb.ToString()); request.ContentLength = b.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(b, 0, b.Length); } try { //响应 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); int statusInt = response.StatusCode.GetHashCode(); //相应成功 if (response.StatusCode.ToString() == "OK") { string responseUri = response.ResponseUri.AbsoluteUri; MessageBox.Show("修改成功!"); LoadPre(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值