C#读取网页内容Streamreader

5
我需要在streamreader中读取网页内容,类似于
www.example.com

<test>
<sample></sample>
</test>

我得到了这个:
System.IO.StreamReader StreamReader1 =
new System.IO.StreamReader("www.example.com");
string test = StreamReader1.ReadToEnd();

但是我接着收到了这个错误代码

尝试访问该方法失败: System.IO.StreamReader..ctor(System.String)

2个回答

28

试试使用WebClient,它更容易使用,而且你不必担心流和河流的问题:

using (var client = new WebClient())
{
    string result = client.DownloadString("http://www.example.com");
    // TODO: do something with the downloaded result from the remote
    // web site
}

4
如果想要使用StreamReader,这是我所使用的代码:
    const int Buffer_Size = 100 * 1024;


        WebRequest request = CreateWebRequest(uri);
        WebResponse response = request.GetResponse();
        result = GetPageHtml(response);

...

    private string GetPageHtml(WebResponse response) {
        char[] buffer = new char[Buffer_Size];
        Stream responseStream = response.GetResponseStream();
        using(StreamReader reader = new StreamReader(responseStream)) {
          int index = 0;
          int readByte = 0;
          do {
              readByte = reader.Read(buffer, index, 256);
              index += readByte;
          }
          while (readByte != 0);
          response.Close();
        }
        string result = new string(buffer);
        result = result.TrimEnd(new char[] {'\0'});
        return result;
    }

如果在所有这些代码的中间抛出异常怎么办?你会让所有这些流泄漏内存到沙漠中吗?而且,你真的要写这么多代码来下载远程网页吗? - Darin Dimitrov
据我所见,异常可能会在reader.Read方法中抛出。因此,它可以被try...finally括号或using包围。另外,我大约一年前编写了这段代码,用于下载广告网站内容以在家中进行分析。我已经修改了代码。 - platon
1
我们编写的任何一行代码都可能随时抛出异常。这正是为什么我们应该始终确保正确处理 IDisposable 对象,例如使用 using 块来释放流。但在这种特殊情况下,为什么要重新发明轮子并编写所有这些代码,当 .NET 框架已经为我们提供了 WebClient,就像我在我的答案中展示的那样。 - Darin Dimitrov
2
你的解决方案更好,因为它更短。只有一行代码。我在这里写出来,因为有时候改变MS提供的方法的一部分变得很重要。这里的例子很简单。你可以将所需的编码传递给StreamReader构造函数,而不是依赖于WebClient的DownloadString方法,后者会尝试猜测编码。 - platon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接