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值,防止有遗漏,造成某些页面爬取不到。

 

PS:刚刚弄懂,可能有没有深入理解,还望高手拍砖O(∩_∩)O~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public static T Post<T>(string url, string data, string staffId, string contentType) { try { byte[] bytes = Encoding.UTF8.GetBytes(data); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); string timeStamp = ApiHelper.GetTimeStamp(); string random = ApiHelper.GetRandom(); httpWebRequest.Headers.Add("staffid", staffId.ToString()); httpWebRequest.Headers.Add("timestamp", timeStamp); httpWebRequest.Headers.Add("nonce", random); //ResultMsg signToken = ApiHelper.GetToken(url, staffId); // httpWebRequest.Headers.Add("signature", ApiHelper.GetSignature(timeStamp, random, staffId, data, signToken)); httpWebRequest.Headers.Add("jwtcookie", GetJwt(url, data));//cwj 直接通过jwt验证身份 httpWebRequest.Method = "POST"; httpWebRequest.ContentLength = (long)bytes.Length; httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"; httpWebRequest.ContentType = contentType; Stream requestStream = httpWebRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); httpWebRequest.Timeout = 300000; httpWebRequest.Headers.Set("Pragma", "no-cache"); HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); Stream responseStream = httpWebResponse.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8); string text = streamReader.ReadToEnd(); requestStream.Close(); streamReader.Close(); responseStream.Close(); httpWebRequest.Abort(); httpWebResponse.Close(); return JsonConvert.DeserializeObject<T>(text); } catch (Exception) { throw; } }
最新发布
06-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值