【发布时间】:2011-02-14 02:16:29
【问题描述】:
.NET 中的WebClient 和HttpWebRequest 类之间有什么区别?他们都做非常相似的事情。事实上,为什么不将它们合并到一个类中(方法/变量等太多可能是原因之一,但 .NET 中还有其他类违反了该规则)。
谢谢。
【问题讨论】:
标签: c# .net httpwebrequest webclient
.NET 中的WebClient 和HttpWebRequest 类之间有什么区别?他们都做非常相似的事情。事实上,为什么不将它们合并到一个类中(方法/变量等太多可能是原因之一,但 .NET 中还有其他类违反了该规则)。
谢谢。
【问题讨论】:
标签: c# .net httpwebrequest webclient
WebClient 是建立在 HttpWebRequest 之上的更高级别的抽象,用于简化最常见的任务。例如,如果您想从 HttpWebResponse 中获取内容,则必须从响应流中读取:
var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();
var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();
使用 WebClient,您只需执行 DownloadString:
var client = new WebClient();
var content = client.DownloadString("http://example.com");
注意:为简洁起见,我在两个示例中都省略了 using 语句。您绝对应该注意正确处理您的 Web 请求对象。
一般来说,WebClient 适用于快速而肮脏的简单请求,而 HttpWebRequest 适用于您需要对整个请求进行更多控制时。
【讨论】:
ServicePointManager.Expect100Continue = false 这样的奇怪解决方法,做其他非标准的事情并且有许多怪癖和特质。我开始使用 RestSharp 来帮助解决这些问题。
HttpClient 的新玩家在.NET 4.5 中可能(或可能不会?)解决上述一些问题麻烦...
using (WebClient client = new WebClient())
WebClient 和 HttpWebRequest 作为legacy,而不是deprecated。
WebClient 也没有超时属性。这就是问题所在,因为默认值是 100 秒,如果没有 Internet 连接,这个值就太大了。
该问题的解决方法在这里https://stackoverflow.com/a/3052637/1303422
【讨论】:
我知道它的回复时间太长了,但这只是为了给未来的读者提供信息:
网络请求
System.Object
System.MarshalByRefObject
System.Net.WebRequest
WebRequest 是一个抽象基类。所以你实际上并不直接使用它。您可以通过它的派生类使用它 - HttpWebRequest 和 FileWebRequest。
您使用 WebRequest 的 Create 方法来创建 WebRequest 的实例。 GetResponseStream 返回data stream。
还有FileWebRequest 和FtpWebRequest 类,inherit 来自WebRequest。通常,您会使用WebRequest 来发出请求并将返回转换为HttpWebRequest、FileWebRequest 或FtpWebRequest,具体取决于您的请求。下面是一个例子:
示例:
var _request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();
网络客户端
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Net.WebClient
WebClient 为来自URI 标识的资源中的sending 和receiving 数据提供通用操作。简单地说,它是HttpWebRequest 的更高层次的抽象。这种“通用操作”是 WebClient 与 HttpWebRequest 的区别所在,如下面的示例所示:
示例:
var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackoverflow.com");
WebClient 实例下还有DownloadData 和DownloadFile 操作。这些常见操作还简化了我们通常使用HttpWebRequest 执行的代码。使用HttpWebRequest,我们必须获得请求的响应,实例化StreamReader 以读取响应,最后将结果转换为我们期望的任何类型。对于WebClient,我们只需调用DownloadData, DownloadFile or DownloadString。
但是,请记住,WebClient.DownloadString 不会考虑您请求的资源的 encoding。因此,如果您不指定编码,您最终可能会收到奇怪的字符。
注意: 与 WebRequest 相比,基本上“WebClient 只需要几行代码”
【讨论】:
webClient.UploadData(url, "POST", bytes) 指定方法(请参阅MSDN docs)。