if (!url.Contains("http")) { url = "http://" + url; } HttpWebRequest request = null; try { request = WebRequest.Create(url) as HttpWebRequest; } catch (Exception e) { cc = null; return e.Message; } request.CookieContainer = new CookieContainer(); request.Method = "GET"; request.UserAgent = DefaultUserAgent; request.Timeout = timeout.Value; request.KeepAlive = DefaultKeep_Alive; request.AllowAutoRedirect = false; if (old_url != null) { request.Referer = old_url; } if (setcook != null) { if (setcook.Count == 0) { setcook = request.CookieContainer; } else { request.CookieContainer = setcook; } } try { HttpWebResponse response = request.GetResponse() as HttpWebResponse; StreamReader reader = new StreamReader(response.GetResponseStream(), DefaultEncoding); cc = response.Cookies; string htmlData = reader.ReadToEnd(); response.Close(); reader.Close(); return htmlData; }
我详细阐述一下问题,我是登录115网盘。当时遇到重定向但是设置AllowAutoRedirect后总是报重定向次数过多,所以我就手动做了重定向的设置但是遇到一个问题。当我取到了一个登录成功需要重定向访问的URL地址。这时我的Cookie是取到了,地址也有了。只要把在GET访问中带上Cookie访问这个地址就成功了。这个原理是对的,因为最后面我也是这样成功登录的,不过在这中间出了一个问题如上面的代码。htmldata总是访问空值,经我检查总是感觉Cookie没有一起提交上去才会这样的,但是Cookie一定是对的地址也是对的。
所以想问问高手前辈们这里是不是我哪里出错了,导致我总是得不到数据。注:我提交的数据用第三方软件提交是完全没问题的,包括cookie与URL地址还有编码什么的。。。真心请教。。。
调试一下看返回空时的Http响应头中有什么信息。
就算这样写result也是不为null。。。取响应头仍然有一个response.Headers["Location"]。。这个属性。。这是将要重定向的地址。。。也就是说刚刚上面的代码并没有错,只是cookie没有加上去。但是我的cooke是CookieContainer明明是赋值上去了怎么会没有用?后来我将cookie转换成字符串,添加在request.Headers[HttpRequestHeader.Cookie] = Lcook。。。。几乎是上面一模一样的代码可就成功了。。。这是为什么,不过成功了却无法从response.Cookies取回cookie因为那里的值为空。。。。请朋友们帮忙看看啊这个问题纠结了一晚上了。。。觉都没睡好。。。
@代码白痴:
你的问题在于改设的Cookie没有设置上
用WebClient类吧,这个类是对HttpWebRequest的封装,你可以直接在Headers属性中设置Cookie的值。
http://msdn.microsoft.com/en-US/library/system.net.webclient.headers(v=vs.80).aspx
建议代码这样写:
using (var result = webRequest.GetResponse()) { if (result != null) { using (var sr = new StreamReader(result.GetResponseStream(), Encoding.UTF8)) { string htmlData = reader.ReadToEnd(); } } }
通过 webRequest.GetResponse().Headers 看一下HTTP响应头信息。
就算这样写result也是不为null。。。取响应头仍然有一个response.Headers["Location"]。。这个属性。。这是将要重定向的地址。。。也就是说刚刚上面的代码并没有错,只是cookie没有加上去。但是我的cooke是CookieContainer明明是赋值上去了怎么会没有用?后来我将cookie转换成字符串,添加在request.Headers[HttpRequestHeader.Cookie] = Lcook。。。。几乎是上面一模一样的代码可就成功了。。。这是为什么,不过成功了却无法从response.Cookies取回cookie因为那里的值为空。。。。请朋友们帮忙看看啊这个问题纠结了一晚上了。。。觉都没睡好。。。
@代码白痴:
参考文章:C# HttpWebRequest 绝技