C#-WebRequest不';不要返回不同的页面

C#-WebRequest不';不要返回不同的页面,c#,html,C#,Html,我的控制台程序的目的是:发出web请求>保存web请求的结果>使用QueryString从web请求获取下一页>保存这些结果>使用QueryString从web请求获取下一页,等等 这里有一些关于如何设置代码的伪代码 for (int i = 0; i < 3; i++) { strPageNo = Convert.ToString(i); //creates the url I want, with incremen

我的控制台程序的目的是:发出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); 
         }
for(int i=0;i<3;i++)
{
strPageNo=转换为字符串(i);
//创建我想要的url,页面递增
strURL=”http://www.website.com/results.aspx?page=“+strPageNo;
//发出web请求
wrGETURL=WebRequest.Create(strURL);
//为我获取网页
objStream=wrGETURL.GetResponse().GetResponseStream();
//用于阅读网页
objReader=新的StreamReader(objStream);
//--------
//-snip-将其保存到文件等的代码。
//--------
objStream.Close();
objReader.Close();
//这样服务器就不会受到攻击
系统线程线程睡眠(1000);
}
很简单,对吧?问题是,即使它增加页码以获得不同的网页,每次循环运行时我都会得到完全相同的结果页

i
的增量正确,我可以将
strURL
创建的url剪切/粘贴到web浏览器中,效果很好

我可以手动输入
&page=1
&page=2
&page=3
,它将返回正确的页面。不知怎么的,把增量放进去会把事情搞砸


这和会议有什么关系吗?我确保在流再次循环之前关闭流和读卡器…

除非您使用MVC或其他能够正确解释查询字符串的工具,否则该URL对我来说意义不大

http://www.website.com/results.aspx&page=
应该是:

http://www.website.com/results.aspx?page=

有些浏览器会接受格式不正确的URL,并将其呈现为精细的。其他人可能没有,这可能是您的控制台应用程序的问题。

除非您使用MVC或其他能够正确解释查询字符串的工具,否则该URL对我来说没有太大意义

http://www.website.com/results.aspx&page=
应该是:

http://www.website.com/results.aspx?page=

有些浏览器会接受格式不正确的URL,并将其呈现为精细的。其他可能没有,这可能是您的控制台应用程序的问题。

如果您在循环过程中每次都尝试创建一个新的WebRequest对象,则可能是Create()方法没有充分清除其所有旧数据


另一件需要检查的事情是,在下一个循环迭代之前,ResponseStream已被充分清除

如果在循环过程中每次都尝试创建一个新的WebRequest对象,则可能是Create()方法没有充分清除其所有旧数据


另一件需要检查的事情是,在下一个循环迭代之前,ResponseStream已被充分清除

只是一个建议,试着处理流,然后读者。我见过一些奇怪的情况,不处理这样的对象并在循环中使用它们可能会产生一些奇怪的结果……

只是一个建议,尝试处理流,然后读取。我见过一些奇怪的情况,不处理像这样的对象并在循环中使用它们会产生一些奇怪的结果……

这段代码对我来说很好:

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);
}

这段代码对我来说很好:

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);
}

以下是我糟糕的、黑客式的解决方案:


制作另一个控制台应用程序来调用此应用程序,其中第一个控制台应用程序在strURL的末尾传递一个参数。它可以工作,但我感觉很脏。

这是我糟糕的、黑客式的解决方案:


制作另一个控制台应用程序来调用此应用程序,其中第一个控制台应用程序在strURL的末尾传递一个参数。它可以工作,但我感觉很脏。

我伪造了它的伪代码。这在我的程序中是正确的。还有什么问题?服务器在控制台程序中看到的用户代理是什么?服务器处理的请求可能与处理特定浏览器的请求完全不同。还有一个问题是,该程序在多大程度上解析了可能是某种东西的web请求的DNS……我伪造了它的伪代码。这在我的程序中是正确的。还有什么问题?服务器在控制台程序中看到的用户代理是什么?服务器处理的请求可能与处理特定浏览器的请求完全不同。还有一个问题是,该程序在多大程度上解析了web请求的DNS,这可能是什么……哈哈,它只是打开了一个streamreader并将其保存到一个txt文档中。你能解析这个问题吗?尤德普_99@yahoo.comHahah,它只是打开一个streamreader并将其保存到一个txt文档中。您曾经解决过这个问题吗?尤德普_99@yahoo.comI无法创建新的WebRequest对象,因为我收到了“这是一个‘方法’,但您使用它就像使用‘类型’”错误。我将objStream.Flush()方法放在循环的末尾,但没有成功:(我无法创建新的WebRequest对象,因为我得到了“这是一个‘方法’,但您像‘类型’一样使用它”错误。我将objStream.Flush()方法放在循环的末尾,但没有成功:(我在循环的末尾添加了objStream/objReader.Dispose(),但没有成功:(我甚至采纳了Dillie-O的建议,并将objStream.Flush()放在末尾,但也没用……我在循环的末尾添加了objStream/objReader.Dispose(),但运气不好:(我甚至采纳了Dillie-O的建议,并将objStream.Flush()放在末尾,但也没用……糟糕。在代码中找到这一行(未显示)WebRequest wrGETURL;将这一行放在你的循环中。世界现在一切都会好起来。顺便说一句,这是Dillie-O说的。糟糕。在你的代码中找到这一行(未显示)WebRequest wrGETURL;将这一行放在你的循环中。世界现在一切都会好起来。顺便说一句,这是Dillie-O说的。