WebClient学习笔记 - [.Net开发]

之前在做那个托福刷位程序时多次使用到HttpWebRequest与HttpWebResponse这两个类,也熟悉了这两个类的使用方法,再深入学习后发现WebClient也是一个很好的工具,对于网络应用有很大的用处,搜集了一些资料,总结下WebClient的使用方法。


一、WebClient概述

从MSDN中我们可以得知,WebClient的作用就是“Provides common methods for sending data to and receiving data from a resource identified by a URI.”也就是说我们可以通过这个类去访问与获取网络上的资源文件。

WebClient类不能被继承,在之前的.Net框架中我都是通过WebRequest和WebResponse这两个类来处理向URI标示的资源和获取数据了。觉得这两个类功能挺强大的,但不足之处的是利用WebRequest和WebResponse时设置过于复杂,使用起来颇为费劲。而WebClient可以理解为对WebRequest和WebResponse等协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持等等,不过我们可以通过重写WebClient的一些方法来实现这些功能。 在做那个托福刷位程序时需要使用到cookies判断,所以使用WebRequest与WebResponse这两个类比较方便。

通过查看MSDN上的解释,我们可以初步了解WebClient的函数与基本用法。

WebClient提供四种将数据上载到资源的方法:
  • OpenWrite 返回一个用于将数据发送到资源的 Stream。
  • UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
  • UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
  • UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。
另外WebClient还提供三种从资源下载数据的方法:
  • DownloadData 从资源下载数据并返回字节数组。
  • DownloadFile 从资源将数据下载到本地文件。
  • OpenRead 从资源以 Stream 的形式返回数据。

二、WebClient与其他网络相关类的区别

WebClient和HttpWebRequst是用来获取数据的2种方式,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程。

三、WebClient使用范例

正如前面所说,WebClient既能上传也能获取下载某个uri资源地址的内容,最后,简单的用一个例子来演示通过WebClient获取资源的方法:

关键的代码如下:

 1 private void button1_Click(object sender, RoutedEventArgs e)
 2         {
 3             //通过WebClient方式去获取资源文件
 4             Uri uri = new Uri("http://localhost:2052/Images/cnblogs.png", UriKind.Absolute);
 5             WebClient webClient = new WebClient();
 6             webClient.OpenReadAsync(uri);
 7             webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
 8             
 9         }
10         void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
11         {
12             Stream stream = e.Result;  
13             BitmapImage bitmap = new BitmapImage();
14             bitmap.SetSource(stream);
15             this.image1.Source = bitmap;
16         }

 
如果是用WebRequest方式来获取资源的话,主要的代码如下:

        private void Button_Click(object sender, RoutedEventArgs e)
        {

             HttpWebRequest request 
=(HttpWebRequest) WebRequest.Create("http://localhost:2052/Images/cnblogs.png");
             request.Method 
= "GET";
             request.BeginGetResponse(
new AsyncCallback(ReadCallback), request);
        }
        
public void ReadCallback(IAsyncResult asyc)
        {
            HttpWebRequest request 
= (HttpWebRequest)asyc.AsyncState;        
            HttpWebResponse response 
= (HttpWebResponse)request.EndGetResponse(asyc); 

this.Dispatcher.BeginInvoke(() =>
                     {
                         Stream stream 
= response.GetResponseStream();
                         BitmapImage bitmap 
= new BitmapImage();                     
                bitmap.SetSource(stream);
                         
this.image1.Source = bitmap;
                     }
                     );
         }



四、备注

1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
3,其请求的Uri必须是绝对地址;
4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
5,因为其回调不是UI线程,所以不能直接对UI进行操作,这里使用Dispatcher.BeginInvoke();


posted @ 2011-08-22 13:13  卿之  阅读(8772)  评论(5编辑  收藏  举报
无觅相关文章插件,快速提升流量