.NET:WebBrowser,WebClient,WebRequest,HTTPWebRequest ...... ARGH!

时间:2009-11-23 01:21:15

标签: c# .net system.net

在System.Net命名空间中,有许多具有相似名称的不同类,例如:

  • WebBrowser和WebClient
  • WebRequest和HTTPWebRequest
  • WebResponse和HTTPWebResponse

这些是我很好奇的主要原因。

每个人的功能是什么?它们彼此有什么不同?

另外,在什么情况下你会使用哪个?

4 个答案:

答案 0 :(得分:41)

WebBrowser 实际上位于System.Windows.Forms命名空间中,是一个可以添加到表单的可视控件。它主要是Internet Explorer浏览器(MSHTML)的包装器。它允许您以编程方式轻松显示和交互网页。您调用Navigate方法传递Web URL,等待它完成下载和显示,然后使用它提供的对象模型与页面交互。

HttpWebRequest 是一个具体的类,允许您通过HTTP在代码中请求任何类型的文件。您通常以字节流的形式接收它。在那之后你用它做什么取决于你的申请。

HttpWebResponse 允许您处理先前使用HttpWebRequest请求的Web服务器的响应。

WebRequest WebResponse 是HttpWebRequest和HttpWebResponse继承的抽象基类。您无法直接创建这些。从这些继承的其他类包括Ftp和File类。

WebClient 我一直认为这是一个很好的帮助类,它提供了更简单的方法,例如,从网址下载或上传文件。 (例如DownloadFile和DownloadString方法)。我听说它实际上在某些方法的幕后使用了HttpWebRequest / HttpWebResponse。

如果您需要对Web请求和响应进行更细粒度的控制,那么HttpWebRequest / HttpWebResponse可能就是您的选择。否则,WebClient通常更简单,并且可以完成这项工作。

答案 1 :(得分:7)

我不知道任何System.Net.WebBrowser,但WebClient基本上是一个类,可以让您轻松地将文件(包括html页面)从Web下载到内存中,甚至直接下载到文件中。基本代码示例如下所示:

string html;
using (var wc = new WebClient())
{
    html = wc.DownloadString("http://stackoverflow.com/questions/1780679/");
}

您可以使用WebClient做很多事情,但是有一些限制。如果你需要做一些严肃的网页抓取,你需要降低级别。这就是HttpWebRequest / HttpWebResponse的用武之地。您可以使用它们以任何顺序发送普通Web浏览器可能发送的任何请求。例如,您可能需要先对网站进行身份验证,然后才能请求您真正需要的页面,而WebClient可能无法执行此操作。 HttpWebRequest会。

现在,还有另外一个选择。 System.Windows.Forms.WebBrowser是一个控件,旨在放置在表单上。它基本上包装了Internet Explorer中使用的引擎,以提供Web浏览器的所有功能。你需要小心使用它来进行一般的抓取:它不可移植(对单声道不好),使用大量资源,与运行完整浏览器有类似的安全问题,并且有副作用,例如可能泄漏弹出窗口。该控件最好以表单形式连接到特定的已知Web资源。例如,您可能有一个待售的Windows窗体应用程序,以及您出售以供下载的Web应用程序。您可以提供一个WebBrowser控件,该控件在此网站上显示几个页面,专门用于在您的应用中查看,允许用户购买应用内升级。

答案 2 :(得分:2)

WebRequest和WebResponse是抽象类。 HTTPWebRequest和HTTPWebResponse是它们的实现。

答案 3 :(得分:0)

WebClient是一种非常简洁的获取HTML页面的方法。 以下是下载响应字符串的代码段。

   string getHtmlPageUsingWC(string strQuery, System.Net.WebProxy proxy = null)
    {
        string strResponse = String.Empty;
        using (WebClient wc = new WebClient())
        {
            wc.Encoding = Encoding.UTF8;
            IWebProxy wp = WebRequest.DefaultWebProxy;
            wp.Credentials = CredentialCache.DefaultCredentials;
            wc.Proxy = wp;
            wc.Headers.Add("Accept-Language:en");

            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("q", strQuery);

            wc.QueryString.Add(nvc);

            try
            {
                strResponse = wc.DownloadString(m_strURL);
            }
            catch (Exception ex)
            {
                strResponse = "Request Declined: " + ex.Message;
                Console.WriteLine(ex.Message);
            }
        }

        return strResponse;
    }