文章目錄
- 一、WebClient概述
- 二、WebClient與其他網路相關類的區別
- 三、WebClient使用範例
- 四、備忘
之前在做那個托福刷位程式時多次使用到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轉向的控制,還有就是缺少對Proxy 伺服器的支援等等,不過我們可以通過重寫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 }
如果是用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;
}
);
}
四、備忘
1,HttpWebRequest是個抽象類別,所以無法new的,需要調用HttpWebRequest.Create();
2,其Method指定了請求類型,這裡用的GET,還有POST;也可以指定ConentType;
3,其請求的Uri必須是絕對位址;
4,其請求是非同步回調方式的,從BeginGetResponse開始,並通過AsyncCallback指定回調方法;
5,因為其回調不是UI線程,所以不能直接對UI進行操作,這裡使用Dispatcher.BeginInvoke();