WebClient 一
时间:2011-04-06 来源:AndyYu
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 的形式返回数据。
其中 webClient.OpenRead(uri) 具体实现主要代码如下:
public Stream OpenRead (Uri address)
开源代码一看就知道WebClient 本质就更好的封装了 WebRequest 和 WebResponse
了解完本质,看看异步读取数据方法OpenReadAsync
WebClient webClient = new WebClient();
webClient.Credentials = CredentialCache.DefaultCredentials; webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCallback2); webClient.OpenReadAsync(new Uri("http://www.cnblogs.cn/"));
public static void OpenReadCallback2(Object sender, OpenReadCompletedEventArgs e) { Stream reply = null; StreamReader s = null; try { reply = (Stream)e.Result; s = new StreamReader(reply); string strResult = s.ReadToEnd(); AppLog.Write(strResult, AppLog.LogMessageType.Error); } finally { if (s != null) { s.Close(); } if (reply != null) { reply.Close(); } } }
异步调用主要方法实现如下:
public void OpenReadAsync (Uri address, object userToken)
{ if (address == null) throw new ArgumentNullException ("address"); lock (this) { SetBusy (); async = true;async_thread = new Thread (delegate (object state) { object [] args = (object []) state; WebRequest request = null; try { request = SetupRequest ((Uri) args [0]); WebResponse response = GetWebResponse (request); Stream stream = response.GetResponseStream (); OnOpenReadCompleted ( new OpenReadCompletedEventArgs (stream, null, false, args [1])); } catch (ThreadInterruptedException){ if (request != null) request.Abort (); OnOpenReadCompleted (new OpenReadCompletedEventArgs (null, null, true, args [1])); } catch (Exception e){ OnOpenReadCompleted (new OpenReadCompletedEventArgs (null, e, false, args [1])); } }); object [] cb_args = new object [] {address, userToken}; async_thread.Start (cb_args); } }
未完待续。。。。。。。。