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提供四种将数据上载到资源的方法:
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./")); 5 6 7 using(Stream stream = webClient.OpenRead("http://www./")) 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./"); 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./") 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./")); 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 }
异步调用时怎么实现的呢?下面将纤细解释实现过程 |
|