【问题标题】:WebClient vs. HttpWebRequest/HttpWebResponseWebClient 与 HttpWebRequest/HttpWebResponse
【发布时间】:2015-04-22 02:41:51
【问题描述】:

在我看来,使用 HttpWebRequest/Response 可以完成的大部分工作也可以通过 WebClient 类完成。我在某处读到WebClientWebRequest/Response 的高级包装器。
到目前为止,我看不到任何可以用HttpWebRequest/Response 完成的事情,而用WebClient 无法完成的事情,也看不到HttpWebRequest/Response 会给你更多“细粒度”控制的地方。

什么时候应该使用 WebClient,什么时候应该使用 HttpWebRequest/Response? (显然,HttpWebRequest/Response 是特定于 HTTP 的。)

如果HttpWebRequest/ResponseWebClient 低,我可以用HttpWebRequest/Response 完成哪些我不能用WebClient 完成的事情?

【问题讨论】:

    标签: .net httpwebrequest webclient httpwebresponse


    【解决方案1】:

    使用HttpWebRequest 可以让您更好地控制请求。可以设置cookies、headers、protocol等……在response中也可以取回cookies和headers

    【讨论】:

    • Thomas,仍然不相信... WebClient 有一个 Headers 属性,您可以像这样检索 cookie:String cookie = webClient.ResponseHeaders(“Set-Cookie”) 并设置它:webClient.Headers .Add("Cookie", "CommunityServer-UserCookie...");
    • 使用 HttpWebRequest 可以定义超时。在 WebClient 中,这是不可能的。
    • @ripper234,其实它可能的:你只需要继承WebClient并重写GetWebRequest来自定义HttpWebRequest
    • @ThomasLevesque 如果您正在继承 webclient 并覆盖 webrequest,那么使用 webclient 似乎毫无意义......
    • @HagaiL,我不同意...您不必手动创建整个请求,您可以使用 base.GetWebRequest 创建它,然后自定义您想要的内容
    【解决方案2】:

    HttpWebRequest 公开了更多允许您进行细粒度协议控制的内容,例如:是否要使用 Keep-Alive、要使用的连接池、是否缓冲写入等等。

    WebClient 不会公开所有这些(尽管您可以从 WebClient 继承并访问底层的 Request 对象)。

    WebClient 适用于您只想进行操作(例如:POST/GET/Form 上传)而无心创建和管理HttpWebRequestRequestStreamHttpWebResponse、和响应流。

    【讨论】:

    • 另外,还有一件事我忘了提。 WebClient 是一个 Component 对象,而 HttpWebRequest 不是。这意味着什么?好吧,如果您使用 VisualStudio 构建 GUI 应用程序,那么您可以在表单上拖放 WebClient 组件并使用它向 HTTP/FTP 等服务器发出请求。
    【解决方案3】:

    来自 Tim Heuer 的博客 - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

    在 Silverlight 中,您需要使用 WebClient 或 HttpWebRequest。有什么不同?这是 timheuer 版本。 WebClient 是一个更简单的实现,非常容易地执行 GET 请求并获得响应流。当您需要对请求进行更精细的控制、需要发送标头或其他自定义项时,HttpWebRequest 非常有用。

    【讨论】:

    • WebClient 也允许 POST,带有 UploadString、UploadData 和 UploadFile
    • @ThomasLevesque 今天有更新版本的课程吗?我看这个讨论有点,嗯……老了……
    • @KonradViltersten,我认为 WebClient 类没有太大变化。对于新应用,我建议您改用 HttpClient,它也非常易于使用且更加灵活。
    • @ThomasLevesque 对,那个是我想的那个。我记得 http 是类名的差异,并被 Http... 部分误导。现在我回到了正确的轨道上。谢谢!
    【解决方案4】:

    WebClient 类在用户界面线程上运行,因此在从 Internet 下载数据时用户界面没有响应。另一方面,HttpWebRequest 类不会阻塞用户界面线程,并且您的应用程序是响应式的。 因此,在需要从 Internet 下载大量数据或数据源访问速度较慢的应用程序中,您应该使用 HttpWebRequest 类;在所有其他情况下,您应该使用 WebClient 类。

    【讨论】:

    • WP7 的情况正好相反。 HttpWebRequest 编组回 Mango 中的 UI 线程,让我现在悲痛欲绝。呸
    • WebClient 也支持异步方法。
    【解决方案5】:

    WebClient 的另一个缺点是当您使用它来获取响应文本时,它会忽略 HTTP ContentTypecharset 值。您必须通过 Encoding 属性显式设置编码。

    【讨论】:

    • 这是一个好点;这不仅仅是设置Encoding 的问题 - 在请求之后您才能知道编码,因此 WebClient api 使您不太可能能够正确下载未知编码的字符串。
    【解决方案6】:

    还有一件事 HttpWebrquest 允许您进行压缩,但 Net.WebClient 类不支持 HTTP 压缩

    【讨论】:

    【解决方案7】:

    “HTTPWebRequest”在 .NET 4.5 中已过时。现在,这个类只是内部的。

    【讨论】:

    • 确实如此。请改用WebRequest
    • 类并没有过时,构造函数已经过时了。而且这个类不是内部的,它仍然是公开的。
    【解决方案8】:

    一个例子:使用 WebClient 在一个请求/响应周期中发布数据并取回处理过的数据似乎是不可能的,但您可以使用 HtttpWebRequest 做到这一点。

    【讨论】:

    • 只需使用 WebClient.UploadString 或 WebClient.UploadData 执行 POST 并返回响应字符串或字节数组。
    • 澄清一下,UploadString 的返回值是一个字符串,UploadData 方法的返回值是一个字节数组。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多