C# 網 絡(WebClient類)
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
? WebClient類如果只想從特定的URI(Uniform Resource Identifier,統一資源標識符)請求文件,則可以使用的最簡單的.NET 類是System.Net.WebClient。這個類是非常高層的類,它只用一兩條命令執行基本操 作。.NET Framework 目前支持以http:、https:和file:標識符開頭的URI。 術語 URL(統一資源定位符)在新的技術規范中已不再使用,現在更常使用的是 URI(統一資源標識符)。URI 的含義大致與URL 相同,但URI 更通用,因為它不意味 著用戶正在使用其中一個熟悉的協議,如HTTP 或FTP。 下載文件使用 WebClient 類下載文件有兩種方法,具體使用哪一種方法取決于文件內容的處理方式。如 果只想把文件保存到磁盤上,就應該使用DownloadFile()方法。這個方法有兩個參數:即文件的URI 和保存所請求的數據的位置(路徑和文件名):
更為常見的是,應用程序需要處理從Web 站點檢索到的數據。為此,要使用OpenRead()方法, 這個方法返回一個Stream 引用。然后,就可以把數據從數據流中提取到內存中:
基本的WebClient示例第一個示例將闡述怎樣使用WebClient.OpenRead()方法。這個示例將把下載的頁面顯示在 ListBox 控件中。首先,作為標準的C# Windows 窗體應用程序新建項目,添加一個名為listBox1 的 列表框,將其docking 屬性設置為DockStyle.Fill。在文件的開頭,需要在using 指令列表中添加 System.Net 和System.IO 名稱空間引用,然后對主窗體的構造函數進行以下改動:
在這個示例中,把System.IO 名稱空間中的StreamReader 類與網絡數據流關聯起來。這樣,就 可以使用高層方法,例如ReadLine()方法,從數據流中以文本的形式獲取數據。據移動抽象化為數據流概念的優點,這個示例就充分體現出了這一點。 WebClient 類還有一個OpenWrite()方法,它可以返回一個可寫的數據流,便于用戶把數據發送 給URI。也可以指定用于把數據發送給主機的方法;默認的方法是POST。下面的代碼段假定在本 地計算機上有一個可寫的目錄accept,這段代碼在該目錄下創建newfile.txt 文件,其內容為“Hello World”:
上傳文件WebClient 類還提供了UploadFile()和UploadData()方法。在需要投遞HTML 窗體或上傳整個文 件時,就可以使用這兩個方法。UploadFile()方法把文件上傳到指定的位置,其中文件名已經給出; 而UploadData()方法把作為字節數組提供的二進制數據上傳至指定的URI(還有一個DownloadData() 方法,用于從URI 中檢索字節數組):
WebClient 類還提供了UploadFile()和UploadData()方法。在需要投遞HTML 窗體或上傳整個文 件時,就可以使用這兩個方法。UploadFile()方法把文件上傳到指定的位置,其中文件名已經給出; 而UploadData()方法把作為字節數組提供的二進制數據上傳至指定的URI(還有一個DownloadData() 方法,用于從URI 中檢索字節數組): WebRequest類和WebResponse類WebRequest 類代表要給某個特定URI 發送信息的請求,URI 作為參數傳遞給Create()方法。 WebResponse 類代表從服務器檢索的數據。調用WebRequest.GetResponse()方法,實際上是把請求發 送給Web 服務器,并創建一個WebResponse 對象,以檢查返回的數據。與WebClient 對象一樣,可以 得到一個代表數據的數據流,但是,這里的數據流使用WebResponse.GetResponseStream()方法獲得。 首先討論怎樣使用這些類下載Web 頁面——這個示例與前面的示例一樣,但使用WebRequest 和WebResponse 類。在此過程中,將解釋涉及的類的層次結構,然后闡述怎樣利用這個層次結構所 支持的其他HTTP 功能。 修改了BasicWebClient 示例,以使用WebRequest 類和WebResponse 類。
在這段代碼中,首先對代表Web 請求的對象進行實例化。但在此沒有使用構造函數,而是調用 靜態的WebRequest.Create()方法,WebRequest 類是支持不同網絡協議的類的層次 結構的一部分,為了給請求類型接收一個對正確對象的引用,需要一個工廠機制。WebRequest.Create() 方法會為給定的協議創建合適的對象。 HTTP 協議的一個重要方面就是能夠利用請求數據流和響應數據流發送擴展的標題信息。標題 信息可以包括cookies 以及發送請求的特定瀏覽器(用戶代理)的詳細信息。果然,.NET Framework 為訪問最重要的數據提供了全方位的支持。WebRequest 類和WebResponse 類提供了讀取標題信息的一些支持。而兩個派生的類HttpWebRequest 和HttpWebResponse 提供了其他HTTP 特定的信息。 因為 HttpWebRequest 對象實例派生自WebRequest 類,所以可以在需要WebRequest 類的任何地方使用新 實例。另外,還可以把實例的類型強制轉換為HttpWebRequest 引用,并訪問HTTP 協議特定的屬性。 同樣,在使用HTTP 時,GetResponse()方法調用會把HttpWebResponse 實例返回為WebResponse 引 用。也可以進行一個簡單的強制轉換,以訪問HTTP 特定的功能。 在 GetResponse()方法調用之前添加如下代碼,可以檢查兩個標題屬性的某些內容:
Timeout 屬性的單位是毫秒,其默認值是100 000。可以設置這個屬性,以控制WebRequest 對 象在拋出WebException 異常之前等待相應的響應時間。可以檢查WebException.Status 屬性,以查看 產生異常的原因。這個枚舉包括超時、連接失敗、協議錯誤等的狀態碼。 因為 KeepAlive 屬性是對HTTP 協議的特定擴展,所以可以通過HttpWebRequest 引用訪問這個 屬性。KeepAlive 屬性允許多個請求使用同一個連接,在后續的請求中節省關閉和重新打開連接的 時間。其默認值為true。 AllowAutoRedirec 屬性也專用于HttpWebRequest 類,使用這個屬性可以控制Web 請求是否應自 動跟隨Web 服務器上的重定向響應。其默認值也是true。如果只允許有限次數的重定向,就可以把 HttpWebRequest 類的MaximumAutomaticRedirections 屬性設置為期望的數值。 請求類和響應類以屬性的形式提供大多數重要的標題,也可以使用Headers 屬性本身顯示標題 的整個集合。在GetResponse()方法調用的后面添加如下代碼,可以把所有標題放在列表框控件中:
身份驗證WebRequest 類中的另一個屬性是Credentials 屬性。如果需要把身份驗證證書附帶在請求中,就 可以用用戶名和密碼創建NetworkCredential 類(也在System.Net 名稱空間中)的一個實例。在調用 GetResponse()方法之前,添加下述代碼:
使用代理許多公司都需要使用代理服務器進行所有類型的HTTP 或FTP 請求。代理服務器常常使用某種 形式的安全性(通常是用戶名和密碼),路由公司的所有請求和響應。對于使用WebClient 對象或 WebRequest 對象的應用程序,需要考慮這些代理服務器。與前面的NetworkCredential 對象一樣,在 進行調用以執行實際請求之前,需要使用WebProxy 對象。
如果除了證書之外,還需要設計用戶的域,就應在NetworkCredential 實例上使用另一個簽名:
異步頁面請求WebRequest 類的另一個特性就是可以異步地請求頁面。這個特性很重要,因為在給主機發送請 求到接收響應之間有很長的延遲。WebClient.DownloadData()和WebRequest.GetResponse()等方法在 響應沒有從服務器回來之前,是不會返回的。如果不希望在那段時間中應用程序處于等待狀態,則 最好使用BeginGetResponse()方法和EndGetResponse()方法,BeginGetResponse()方法可以異步地工 作,并立即返回。在底層,運行庫會異步地管理一個后臺線程,以從服務器上接收響應。 BeginGetResponse()方法不返回WebResponse 對象,而是返回一個實現IAsyncResult 接口的對象。使 用這個接口可以選擇或等待可用的響應,然后調用EndGetResponse()方法搜集結果。 也可以把一個回調委托傳遞給BeginGetResponse()方法。該回調委托的目的地是一個返回類型 為void 并把IAsyncResult 引用作為參數的方法,當工作線程搜集完響應后,運行庫就調用該回調委 托,以通知用戶工作已完成。如下面的代碼所示,在回調方法中調用EndGetResponse()方法可以檢 索WebResponse 對象:
注意可以作為BeginGetResponse()的第二個參數傳遞WebRequest 對象,檢索最初的WebRequest 對象。第二個參數是一個對象引用,稱為狀態參數。在回調方法的過程中,可以使用IAsyncResult 接口的AsyncState 屬性檢索相同的狀態對象。 閱讀原文:原文鏈接 該文章在 2025/3/31 11:14:51 編輯過 |
關鍵字查詢
相關文章
正在查詢... |