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 剪切/粘贴到网络浏览器中,它工作得很好。

我可以手动输入&amp;page=1&amp;page=2&amp;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#使用WebClient与WebRequest有啥不同

WebRequest 奇怪的 NotFound 错误

C#使用(HttpWebRequest)WebRequest.Create()判断是不是连接服务器时,请求时间过久

c# JSON REST 响应通过 3 种不同的方法(WebRequest、RESTSharp、HttpClient)是空的,但 Postman 和浏览器可以工作

即使设置了无限超时,Webrequest 也会超时

在c#中将html转换为json