C#HttpClient或使用CookieContainer模拟登陆后HttpRequest不发送cookie的解决方法及原因
2016-08-24 16:09
991 查看
解决办法
在发送包含用户名和密码的POST请求后,得到了包含”Set-cookie”的HttpWebResponse,随后应当添加如下代码//Cookies为CookieContainer对象,Response为HttpWebResponse对象 Uri Host = new Uri("http://example.cn"); foreach (Cookie cookie in Response.Cookies) cookies.SetCookies(Host, ("" + cookie.Name + "=" + cookie.Value));
原因
简单的说,这个问题的原因源于CookieContainer的设计不足,鲁棒性不够强。这里我们来简单了解一下Cookie方面的知识,rfc6265第5.3节定义了浏览器存放每个Cookie时应该包括这些字段:name、value、expiry-time、domain等等,但并不是每个网站都设计在Set-cookie时向用户返回所有的字段,比如下图的情况就只返回了name、value、expiry三个字段
重点在于,如上图的Set-Cookie头缺省了domain字段,对于一般浏览器来说,当接收到了缺省domain的Set-Cookie字段时,会主动添加本次请求地址的Host上去。而CookieContainer设计之初并没有打算主动帮助用户添加被请求Url的Host进Cookies(大家都不知道为毛),于是在CookieContainer中发生的事情就是,当CookieContainer看到了domain缺省的Set-Cookie字段,就直接把request的Url添加进了Cookie。
这会造成什么结果?我们假设有一个Host为Http://example.cn ,当我们登陆时会向/user/login.php POST一段信息,然后该地址返回Cookies,但由于CookieContainer将该完整地址保存给了这些Cookies,于是这些Cookies会并且只会在访问Http://example.cn/user/login.php时被发送。这就造成了题目所说的问题。
而上面的代码做的工作就是为现有的CookieContainer手动添加在Host下设置的cookie,这样当我们访问/user/home.php或者任何其他子节点的时候,Cookies就能够正常发送了。
关于HttpClient
HttpClient类型保存Cookies时用的是一个Flag为Protect的CookieContainer对象,所以HttpClient也会遇到一模一样的问题,而且由于在这里对象是Protect的,所以不能手动修改,暂时不知道如何在HttpClient中解决这一问题。参考链接
1、HttpWebRequest and CookieContainer - login to a website2、HttpWebRequest with CookieContainer problem in .NET 4+?
相关文章推荐
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- 使用C#的HttpWebRequest模拟登陆网站
- c#第一篇 在WPF的window窗体中使用httpwebrequest实现模拟登陆网页,并在webbroser控件中显示
- 转:使用C#的HttpWebRequest模拟登陆网站
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- C#使用HttpWebRequest进行HTTP请求发送和接收的一些小结。(新增修复.NET4.0以下关于cookie的bug)
- c# 使用 HttpWebRequest模拟登陆
- C#使用HttpWebRequest模拟登陆(附带验证码)
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- 使用C#的HttpWebRequest模拟登陆网站
- C# HttpWebRequest保存cookies模拟登录的方法【z】【解决】
- [转发]HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- 使用C#的HttpWebRequest模拟登陆网站
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- 【转】C# WebRequest发起Http Post请求模拟登陆并cookie处理示例
- HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- Firefox和Chrome不断发送http://127.0.0.1:35000/*/requestgrab/请求的原因与解决方法
- 使用C#的HttpWebRequest模拟登陆网站(续)