WebClient學習筆記 – [.Net開發]

來源:互聯網
上載者:User
文章目錄
  • 一、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();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.