WebClient 一

WebClient 类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法。

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还提供三种从资源下载数据的方法:

  我们现在已OpenRead为例看看是怎么样实现其功能的  

   

 

 1              WebClient webClient  =   new  WebClient();
 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)

2          {
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/");

 2              WebResponse response  =  request.GetResponse();
 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;

 2              HttpWebResponse response  =  (HttpWebResponse)request.GetResponse();
 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   // 异步调用

2              WebClient webClient  =   new  WebClient();
3              webClient.Credentials  =  CredentialCache.DefaultCredentials;
4              webClient.OpenReadCompleted  +=   new  OpenReadCompletedEventHandler(OpenReadCallback2);
5              webClient.OpenReadAsync( new  Uri( " http://www.cnblogs.cn/ " ));
 1 //异步调用的事件 
 2  public   static   void  OpenReadCallback2(Object sender, OpenReadCompletedEventArgs e)
 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             }
26         }

异步调用时怎么实现的呢?下面将纤细解释实现过程。 


你可能感兴趣的:(client)