【问题标题】:C# - WebRequest Doesn't Return Different PagesC# - WebRequest 不返回不同的页面
【发布时间】: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

标签: c# html


【解决方案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 解析效果如何......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多