WebClient 类使用 WebRequest 类提供对资源的访问。WebClient 实例可以通过任何已向 WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。
WebRequest 和 WebResponce 过于庞大复杂,于是WebClient简单易用孕育而生。查看反编译后WebClient类会发现其中最核心的是包含类WebRequest 和 WebResponse调用来玩车的那个所有的访问、上传和下载的功能,也提供了虚方法为子类继承自WebClient很容易实现其功能。微软开开发此功能的目的是为更方便的抽象出对网络资源访问的封装而已。
下面将分析WebClient 最主要的功能,及分析是怎样通过WebRequest 和 WebResponce 实现其期功能的。
WebClient 构造函数
.Ctor 包括 一个空构造函数 和一个静态构造函数, 静态构造函数主要为UrlEncode 和UrlEncodeAndWirte 编码提供参照byte[]数据的初始化作用。
stati WebClient()
public WebClient()
WebClient提供四种将数据上载到资源的方法:
- OpenWrite 返回一个用于将数据发送到资源的 Stream。
- UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
- UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
- UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。
WebClient还提供三种从资源下载数据的方法:
- DownloadData 从资源下载数据并返回字节数组。
- DownloadFile 从资源将数据下载到本地文件。
- OpenRead 从资源以 Stream 的形式返回数据。
2 webClient.Credentials = CredentialCache.DefaultCredentials;
3 webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCallback2);
4 webClient.OpenReadAsync(new Uri("http://www.cnblogs.cn/"));
5
6
7 using(Stream stream = webClient.OpenRead("http://www.cnblogs.cn/"))
8 using (StreamReader reader = new StreamReader(stream))
9 {
10 if (reader != null)
11 {
12 string strResult = reader.ReadToEnd();
13 AppLog.Write(strResult,AppLog.LogMessageType.Info);
14 }
15 reader.Close();
16 stream.Close();
17 }
18 webClient.Dispose();
其中 webClient.OpenRead(uri)放去实现是通过调用WebRequest 和WebResponse来实现的
1 public Stream OpenRead (Uri address)
3 if (address == null)
4 throw new ArgumentNullException ("address");
5 WebRequest request = SetupRequest (address);
6 WebResponse response = GetWebResponse (request);
7 return response.GetResponseStream ();
8 }
同理:如果我们通过WebRequest 和 WebResponse 和 HttpWebRequest 和HttpWebResponse 实现代码如下:
1 WebRequest request = WebRequest.Create("http://www.cnblogs.cn/");
3 using (Stream stream = response.GetResponseStream())
4 using (StreamReader reader = new StreamReader(stream))
5 {
6 if (reader != null)
7 {
8 string strResult = reader.ReadToEnd();
9 //AppLog.Write(strResult, AppLog.LogMessageType.Info);
10 }
11 reader.Close();
12 stream.Close();
13 response.Close();
14 }
这里实现功能同WebClient实现的功能是一样的,由于WebResponce 和WebRequest 都是抽象类,不需实例化,通过调用静态方法实现功能。
1 HttpWebRequest request = WebRequest.Create("http://www.cnblogs.cn/") as HttpWebRequest;
3 using (Stream stream = response.GetResponseStream())
4 using (StreamReader reader = new StreamReader(stream))
5 {
6 string strResult = reader.ReadToEnd();
7 AppLog.Write(strResult, AppLog.LogMessageType.Info);
8 reader.Close();
9 stream.Close();
10 }
11 response.Close();
HttpWebRquest 继承自 WebRequest HttpWebResponse 继承自WebResponce ,这些将在会详细分析。
关于WebClient 看看异步读取数据方法OpenReadAsync 如下:
1 // 异步调用
3 webClient.Credentials = CredentialCache.DefaultCredentials;
4 webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCallback2);
5 webClient.OpenReadAsync(new Uri("http://www.cnblogs.cn/"));
3 {
4 Stream reply = null;
5 StreamReader s = null;
6
7 try
8 {
9 reply = (Stream)e.Result;
10 s = new StreamReader(reply);
11 string strResult = s.ReadToEnd();
12 AppLog.Write(strResult, AppLog.LogMessageType.Error);
13 }
14 finally
15 {
16 if (s != null)
17 {
18 s.Close();
19 }
20
21 if (reply != null)
22 {
23 reply.Close();
24 }
25 }
异步调用时怎么实现的呢?下面将纤细解释实现过程。