我使用HttpWebRequest模拟登录WordPress,可是总是返回的response.Cookies属性中总是要少个cookies这样让我无法成功登录,但是response.Headers["Set-Cookie"],却能得到全部cookies。查了百度好久没有办法解决。
因为我需要返回CookieCollection程序后面要用着,不能直接使用response.Headers["Set-Cookie"]返回的string字符串,所以我就想问问怎么能将set-cookie取到的字符串转成CookieCollection。最好是通用的,这样我就可以改一下POST方法全部取set-cookie的值再转成CookieCollection。
或者哪位高手能指点一下怎么能取全完整的cookies,谢谢各位了小弟真的很急
可以用CookieContainer,参考代码:如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
这代码没有用与我的差别不大,但是如果成功应该是取回3个cookies,但是仍然只能取回两个
@风灵波: 你用HttpWebRequest时,UserAgent设置的是普通浏览器的吗?
@dudu: 是的,是我抓包的浏览器信息,只有这样才能得到response.Headers["Set-Cookie"]全整的信息。
如果高手不太忙可以下载WordPress试试
@风灵波: 找到一个参考:Login Wordpress using HttpWebRequest
@dudu: 前辈,我发现了一个不知道算不算问题的问题,Set-Cookie取回cookies中,有两个是相同的。而这两个相同的只恰好就是response.Cookies没有取到的值。这是不是有关系?response.Cookies只能取回两个,set-cookie能取回四个
@风灵波: 这里提到的问题与你遇到的问题一样 —— CookieContainer doesn't save all cookies
试试:
request.AllowAutoRedirect = false;
@dudu: 是的好像啊,WP登录是有一个302重定向,我也的确设置的是request.AllowAutoRedirect = true ;但就算改成false仍然取不完全。。。这到底是什么一个问题真是郁闷。。。不过还是要谢谢前辈的耐心指点
@风灵波: 那篇帖子中不是已经写出解决问题的代码了吗?
@dudu: 您是说最后一篇吗?他是手动重定向,可是cookies仍然不是全的啊。。。在手动处理时设置request.AllowAutoRedirect = false,这个我是知道的。。。但是之前的cookies仍然不全。。。这让我没有办法
@风灵波: 就是Actual fix部分的代码:
if (response.GetType() == typeof(HttpWebResponse)) { if(response.Headers["Location"] != null) { cookieContainer.Add(response.ResponseUri, GetAllCookiesFromHeader(response.Headers["Set-Cookie"], response.ResponseUri.Host)); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(response.Headers["Location"]); req.Method = "GET"; req.AllowAutoRedirect = false; req.CookieContainer = cookieContainer; req.UserAgent = userAgent; req.Timeout = timeout; req.Accept = accept; return GetWebResponse(req); }
@dudu: 这个是提问的人自己修正的代码,不过最重要的GetAllCookiesFromHeader与GetWebResponse方法没有代码。。。。所以这段其他没有什么用,,,,GetWebResponse基本上知道是写的什么没什么问题,,,GetAllCookiesFromHeader看他提供的参数其他用的也就是我这个问题提的方法,如何将set-cookes转成CookieCollection
@风灵波: 参考代码:http://stackoverflow.com/a/1462309
@dudu: 是的,,这篇文章我也找到了正好有这个方法,,,前辈您真的是好热心啊,希望以后能多多向您学习