Mircsoft在dotnet1.1架構下提供的向 URI 標識的資源發送資料和從 URI 標識的資源接收資料的公用方法。
通過這個類,大家可以在瀏覽器外用的基礎上類比瀏覽器對互連網上的資源的訪問和發送資訊。
WebClient類不能被繼承,在dotnet1.1架構中已經為我們提供了WebRequest和WebResponse兩個強大的類來
處理向URI標示的資源和擷取資料了。然後,不足的是利用WebRequest和WebResponse時設定過於複雜。
使用起來頗為費勁。於是乎有了現在的WebClient,WebClient其實可以理解為對WebRequest和WebResponse等
協作的封裝。它使人們使用起來更加簡單方便,然後它也有先天不足的地方。那就是缺少對cookies/session的
支援,使用者無法對是否自動url轉向的控制,還有就是缺少對Proxy 伺服器的支援。關於session/url轉向控制/代理
伺服器的使用我將在以後關於WebRequest/WebResponse的話題裡面向大家介紹。下面先給大家簡單介紹一
下WebClinet類。
類名:WebClient
命名空間System.Net.WebClient
公用建構函式
WebClient 建構函式 |
初始化 WebClient 類的新執行個體。 |
公用屬性
BaseAddress |
擷取或設定 WebClient 發出請求的基 URI。 |
Container(從 Component 繼承) |
擷取 IContainer,它包含 Component。 |
Credentials |
擷取或設定用於對向 Internet 資源的請求進行身分識別驗證的網路憑據。 |
Headers |
擷取或設定與請求關聯的標題成對的名稱和數值集合。 |
QueryString |
擷取或設定與請求關聯的查詢成對的名稱和數值集合。 |
ResponseHeaders |
擷取與響應關聯的標題成對的名稱和數值集合。 |
Site(從 Component 繼承) |
擷取或設定 Component 的 ISite。 |
公用方法
CreateObjRef(從 MarshalByRefObject 繼承) |
建立一個對象,該對象包含產生用於與遠程對象進行通訊的代理所需的全部相關資訊。 |
Dispose(從 Component 繼承) |
已重載。釋放由 Component 佔用的資源。 |
DownloadData |
從具有指定 URI 的資源下載資料。 |
DownloadFile |
從具有指定 URI 的資源將資料下載到本地檔案。 |
Equals(從 Object 繼承) |
已重載。確定兩個 Object 執行個體是否相等。 |
GetHashCode(從 Object 繼承) |
用作特定類型的雜湊函數,適合在雜湊演算法和資料結構(如雜湊表)中使用。 |
GetLifetimeService(從 MarshalByRefObject 繼承) |
檢索控制此執行個體的生存期策略的當前生存期服務物件。 |
GetType(從 Object 繼承) |
擷取當前執行個體的 Type。 |
InitializeLifetimeService(從 MarshalByRefObject 繼承) |
擷取控制此執行個體的生存期策略的生存期服務物件。 |
OpenRead |
為從具有指定 URI 的資源下載的資料開啟一個可讀的流。 |
OpenWrite |
已重載。開啟一個流以將資料寫入具有指定 URI 的資源。 |
ToString(從 Object 繼承) |
返回表示當前 Object 的 String。 |
UploadData |
已重載。將資料緩衝區上傳到具有指定 URI 的資源。 |
UploadFile |
已重載。將本地檔案上傳到具有指定 URI 的資源。 |
UploadValues |
已重載。將名稱/值集合上傳到具有指定 URI 的資源。 |
從上表中我們可以看到WebClient提供四種將資料上傳到資源的方法:
- OpenWrite 返回一個用於將資料發送到資源的 Stream。
- UploadData 將位元組數組發送到資源並返回包含任何響應的位元組數組。
- UploadFile 將本地檔案發送到資源並返回包含任何響應的位元組數組。
- UploadValues 將 NameValueCollection 發送到資源並返回包含任何響應的位元組數組。
另外WebClient還提供三種從資源下載資料的方法:
- DownloadData 從資源下載資料並返回位元組數組。
- DownloadFile 從資源將資料下載到本地檔案。
- OpenRead 從資源以 Stream 的形式返回資料。
下面我們將通過一個簡單的應用程式來測試WebClient的最簡單用法作為本小節的結束讓大家對WebClient有個初步的認識
例子1:利用WebClient實現對部落格園首頁的訪問
首先我們用HttpLook對這次訪問進行分析,為了方便分析我特別將瀏覽器對圖片的訪問去掉 讓我們能看到更簡便的分析結果
我們可以看到整個過程中我們發起了4次資源請求,其中第一次是對部落格園首頁進行訪問
第二次訪問的是樣式表檔案,第三和四次訪問的是js指令碼。
我們點擊第一項可以看見關於這次資源訪問的http頭部資訊,所謂http頭部就是我們不能看見的瀏覽器和遠程伺服器傳遞的一些隱藏元素。
1GET / HTTP/1.1
2Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
3Accept-Language: zh-cn
4UA-CPU: x86
5Accept-Encoding: gzip, deflate
6User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
7Host: www.cnblogs.com
8Connection: Keep-Alive
9Cookie: .DottextCookie=(隱藏)
這些http資訊包含了瀏覽器訪問的過程。其中
第一行:請求地址的相對路徑和使用協議 相對路徑為/ 協議採用http1.1
第二行:表示我們請求的資源種類。
第三行:我們的語言是簡體中文。
第四行:我們使用的cup結構。這個http頭在一般的網頁中並不過見。估計是部落格園的一次調查??
第五行:標示採用gzip方式壓縮html編碼進行傳遞。只有一些瀏覽器支援的gzip解壓縮時採用這種方式傳遞文本。由於我們
要寫的程式不具備gzi解壓縮的能力 所以我們不考慮使用這種方式發送請求。
第六行:瀏覽器說明
第七行:當前主機地址
第八行:串連請求狀態
第九行:cookies資訊
我在建立的應用程式裡面利用WebClient來實現這了一過程。
下面我將就關鍵實現做一些解釋
1WebClient _client=new WebClient();
2 _client.BaseAddress="http://www.cnblogs.com";
3 _client.Headers.Add("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
4 _client.Headers.Add("Accept-Language","zh-cn");
5 _client.Headers.Add("UA-CPU","x86");
6 //_client.Headers.Add("Accept-Encoding","gzip, deflate");
7 _client.Headers.Add("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
8 System.IO.Stream objStream=_client.OpenRead("/");
9 System.IO.StreamReader _read=new System.IO.StreamReader(objStream,System.Text.Encoding.UTF8);
10 textBox1.Text=_read.ReadToEnd();
第一行:建立一個WebClient 執行個體_client
第二行~第七行:將上邊捕捉到的Http頭部放入到_client執行個體,注意第六行的被注釋掉了。因為我們的程式無法進行gzip解碼所以如果這樣請求
獲得的資源可能無法解碼。當然我們可以給程式加入gzip處理的模組 那是題外話了。
第八行:利用_client.OpenRead(string URI)的方法擷取網上資源的Stream
第九行:利用StreamReader將Stream用我們需要的編碼方法去解析。這裡使用了UTF8。對應不同的網站可以使用Default等不同的解碼方法。
第十行:將我們解碼後的內容放到textBox1裡面顯示出來
好了 大致關於WebClient的介紹就到這裡了。以後將為大家陸續介紹WebClient的各種屬性和方法。
利用WebClient做個資源小偷其實是很簡單的,所以大家一定要防盜鏈阿!!!