C# - WebRequest 不返回不同的页面
Posted
技术标签:
【中文标题】C# - WebRequest 不返回不同的页面【英文标题】:C# - WebRequest Doesn't Return Different Pages 【发布时间】:2010-09-24 01:01:54 【问题描述】:这是我的控制台程序的目的:发出 Web 请求 > 保存 Web 请求的结果 > 使用 QueryString 从 Web 请求中获取下一页 > 保存这些结果 > 使用 QueryString 从 Web 请求中获取下一页等。
所以这里有一些关于我如何设置代码的伪代码。
for (int i = 0; i < 3; i++)
strPageNo = Convert.ToString(i);
//creates the url I want, with incrementing pages
strURL = "http://www.website.com/results.aspx?page=" + strPageNo;
//makes the web request
wrGETURL = WebRequest.Create(strURL);
//gets the web page for me
objStream = wrGETURL.GetResponse().GetResponseStream();
//for reading web page
objReader = new StreamReader(objStream);
//--------
// -snip- code that saves it to file, etc.
//--------
objStream.Close();
objReader.Close();
//so the server doesn't get hammered
System.Threading.Thread.Sleep(1000);
很简单,对吧? 问题是,即使它增加页码以获得不同的网页,每次循环运行时我都会得到完全相同的结果页面。
i
是正确递增的,我可以将strURL
创建的 url 剪切/粘贴到网络浏览器中,它工作得很好。
我可以手动输入&page=1
、&page=2
、&page=3
,它会返回正确的页面。不知何故,把增量放在那里搞砸了。
它与会话有什么关系,还是什么?我确保在它再次循环之前关闭流和阅读器...
【问题讨论】:
哈哈,它只是打开一个流式阅读器并将其保存到一个txt文档。 你能解决这个问题吗? j_depp_99@yahoo.com 【参考方案1】:这是我可怕的、hack-ish 的解决方法:
创建另一个调用 THIS 的控制台应用程序,其中第一个控制台应用程序在 strURL 的末尾传递一个参数。它有效,但我觉得很脏。
【讨论】:
不好。在您的代码中找到这一行(未显示) WebRequest wrGETURL;把那条线放在你的循环里面。现在世界一切都会好起来的。顺便说一句,Dillie-O 就是这么说的。【参考方案2】:这段代码对我来说很好用:
var urls = new [] "http://www.google.com", "http://www.yahoo.com", "http://www.live.com" ;
foreach (var url in urls)
WebRequest request = WebRequest.Create(url);
using (Stream responseStream = request.GetResponse().GetResponseStream())
using (Stream outputStream = new FileStream("file" + DateTime.Now.Ticks.ToString(), FileMode.Create, FileAccess.Write, FileShare.None))
const int chunkSize = 1024;
byte[] buffer = new byte[chunkSize];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
byte[] actual = new byte[bytesRead];
Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead);
outputStream.Write(actual, 0, actual.Length);
Thread.Sleep(1000);
【讨论】:
【参考方案3】:只是一个建议,尝试处理 Stream 和 Reader。我见过一些奇怪的情况,不处理这样的对象并在循环中使用它们会产生一些古怪的结果....
【讨论】:
我将 objStream/objReader.Dispose() 添加到循环的末尾,但没有成功 :( 我什至接受了 Dillie-O 的建议并将 objStream.Flush() 放在末尾,但它没有也无济于事...【参考方案4】:您是否尝试过在循环期间每次都创建一个新的 WebRequest 对象,这可能是 Create() 方法没有充分清除其所有旧数据。
要检查的另一件事是 ResponseStream 在下一次循环迭代之前被充分清除。
【讨论】:
我无法创建新的 WebRequest 对象,因为我收到“它是一个‘方法’但你使用它就像一个‘类型’”错误。我将 objStream.Flush() 方法放在循环的末尾,但没有成功:(【参考方案5】:除非您使用 MVC 或可以正确解释查询字符串的东西,否则该 URL 对我来说不太有意义。
http://www.website.com/results.aspx&page=
应该是:
http://www.website.com/results.aspx?page=
一些浏览器会接受格式不正确的 URL 并呈现它们。其他可能不是,这可能是您的控制台应用程序的问题。
【讨论】:
我为伪代码捏造了它。在我的程序中是正确的。还有什么问题? 服务器从控制台程序看到的用户代理是什么?也许服务器处理请求的方式与来自特定浏览器的请求完全不同。还有一个问题是程序对可能是什么的 Web 请求的 DNS 解析效果如何......以上是关于C# - WebRequest 不返回不同的页面的主要内容,如果未能解决你的问题,请参考以下文章
C#使用(HttpWebRequest)WebRequest.Create()判断是不是连接服务器时,请求时间过久
c# JSON REST 响应通过 3 种不同的方法(WebRequest、RESTSharp、HttpClient)是空的,但 Postman 和浏览器可以工作