WebRequest 和 HttpWebRequest 区别

本文介绍HTTP协议的基本概念及工作流程,并演示如何使用C#语言中的HttpWebRequest和HttpWebResponse类来处理HTTP请求和响应。
2009-10-26 11:54 by 彭白洋, 1696 阅读, 0评论, 收藏, 编辑

首先介绍一下HTTP协议,HTTP亦即Hpyer Text Transfer Protocal的缩写,它是现代互联网上最重要的一种网络协议,超文本传输协议位于TCP/IP协议的应用层,是一个面向无连接、简单、快速的C/S结构的协议。HTTP的工作过程大体上分连接、请求、响应和断开连接四个步骤。C#语言对HTTP协议提供了良好的支持,在.NET类库中提供了WebRequest和WebResponse类,这两个类都包含在System.Net命名空间中,利用这两个类可以实现很多高级的网络功能,本文中多线程文件下载就是利用这两个类实现的。 WebRequest和WebResponse都是抽象基类,因此在程序中不能直接作为对象使用,必须被继承,实际使用中,可根据URI参数中的URI前缀选用它们合适的子类,对于HTTP这类URI,HttpWebRequest和HttpWebResponse类可以用于处理客户程序同WEB服务器之间的HTTP通讯。

  HttpWebRequest类实现了很多通过HTTP访问WEB服务器上文件的高级功能。HttpWebRequest类对WebRequest中定义的属性和方法提供支持,HttpWebRequest将发送到Internet资源的公共HTTP标头的值公开为属性,由方法或系统设置,常用的由属性或方法设置的HTTP标头为:接受, 由Accept属性设置, 连接, 由Connection属性和KeepAlive属性设置, Content-Length, 由ContentLength属性设置, Content-Type, 由ContentType属性设置, 范围, 由AddRange方法设置. 实际使用中是将标头信息正确设置后,传递到WEB服务器,WEB服务器根据要求作出回应。

  HttpWebResponse类继承自WebResponse类,专门处理从WEB服务器返回的HTTP响应,这个类实现了很多方法,具有很多属性,可以全面处理接收到的互联网信息。在HttpWebResponse类中,对于大多数通用的HTTP标头字段,都有独立的属性与其对应,程序员可以通过这些属性方便的访问位于HTTP接收报文标头字段中的信息,本例中用到的HttpWebResponse类属性为:ContentLength 既接收内容的长度。

  有了以上的了解后,下面看看这两个类的用法,要创建HttpWebRequest对象,不要直接使用HttpWebRequest的构造函数,而要使用WebRequest.Create方法初始化一个HttpWebRequest实例,如:

HttpWebRequest hwr=(HttpWebRequest)WebRequest.Create(http://www.163.com/);
  创建了这个对象后,就可以通过HttpWebRequest属性,设置很多HTTP标头字段的内容,如hwr.AddRange(100,1000);设置接收对象的范围为100-1000字节。

  HttpWebReques对象使用GetResponse()方法时,会返回一个HttpWebResponse对象,为提出HTTP返回报文信息,需要使用HttpWebResponse的GetResponseStream()方法,该方法返回一个Stream对象,可以读取HTTP返回的报文,如:首先定义一个Strean 对象 public System.IO.Stream ns; 然后 ns=hwr.GetResponse ().GetResponseStream ();即可创建Stream对象。

### 抽象层级与封装程度 - **WebClient**:是一种更高级别的抽象,为简化常见任务而创建,相当于封装了 request response 方法,使用更为简单,减少了很多细节,代码量也比较少,但缺少基本的 header、timeout 设置等,不过可通过继承 HttpWebRequest 来实现这些功能。它 HttpWebRequest 继承的是不同类,在继承上没有关系[^1]。 - **HttpWebRequest**:属于低级 API,提供对 HTTP 请求的细粒度控制,支持多种 HTTP 方法高级功能,开发人员可以对请求的各个方面进行详细设置[^2]。 - **HttpClient**:是现代且功能强大的 HTTP 客户端,在 .NET 4.5 引入,属于较为高级的抽象,提供了更简洁的 API 来处理 HTTP 请求,同时具备可配置性强等特点[^3]。 ### 异步支持 - **WebClient**:不支持异步操作,适合不需要异步操作、简单的 GET POST 请求场景,不适合长时间运行的操作[^2]。 - **HttpWebRequest**:同样不支持异步操作,适用于需要细粒度控制但不需要异步操作的场景[^2]。 - **HttpClient**:支持异步操作,适合长时间运行的操作、复杂的 HTTP 请求以及需要高级配置的场景,通过异步方法可以提高程序的响应性能资源利用率[^2]。 ### 性能表现 - **WebClient**:使用可能比 HttpWebRequest 直接使用更慢(大约几毫秒),因为它在封装过程中会有一些额外的开销,但使用简单,代码量少[^1]。 - **HttpWebRequest**:由于是低级 API,直接操作请求响应,性能上相对较为高效,但需要处理更多的细节,代码量相对较多。 - **HttpClient**:具有连接复用功能,通过连接池提高性能,适合多次请求操作。不过它有预热机制,第一次进行访问时比较慢,所以建议使用单例或其他方式获取 HttpClient 的实例[^3]。 ### 功能特性 - **WebClient**:功能有限,例如缺少基本的 header、timeout 设置等,不过这些可以通过继承 HttpWebRequest 来实现[^1]。 - **HttpWebRequest**:功能丰富,支持多种 HTTP 方法高级功能,如自定义请求头、超时设置等,开发人员可以对请求进行详细的定制[^2]。 - **HttpClient**:可配置性强,支持设置超时、取消请求、重试策略等高级功能,还支持异步操作连接复用,能更好地适应复杂的网络请求场景[^2]。 ### 代码示例对比 #### WebClient ```csharp using System; using System.Net; class Program { static void Main() { using (WebClient client = new WebClient()) { string response = client.DownloadString("https://www.example.com"); Console.WriteLine(response); } } } ``` #### HttpWebRequest ```csharp using System; using System.IO; using System.Net; class Program { static void Main() { string url = "https://www.example.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream)) { string responseText = reader.ReadToEnd(); Console.WriteLine(responseText); } } } } } ``` #### HttpClient ```csharp using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync("https://www.example.com"); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); Console.WriteLine(content); } } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值