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 }
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;
}
);
}
{
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();
@:卿之 → http://www.cnblogs.com/wpdev
©:博文是本人当时的学习笔记及知识整理,由于自身局限错误在所难免,敬请斧正.
©:本文版权属于博客园和本人,版权基于署名 2.5 中国大陆许可协议发布,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接和署名卿之(包含链接),不得删节,否则保留追究法律责任的权利。