對于System.Net.Http的學習(一)——System.Net.Http 簡介
使用 HttpClient 進行連接
使用 System.Net.Http 命名空間中的 HttpClient 類可以向 WebService發送 POST與GET 請求并檢索響應數據。
System.Net.Http 命名空間中的類可為現代 HTTP 應用提供編程接口。System.Net.Http 命名空間和相關的 System.Net.Http.Headers 命名空間提供的 HTTP 客戶端組件,允許用戶通過 HTTP 使用現代的 WebService。
HttpClient 類用于通過 HTTP 發送和接收基本要求。它提供了一個用于從 URI 所標識的資源發送 HTTP 請求和接收 HTTP 響應的基類。該類可用來向 Web Service發送 GET、PUT、POST、DELETE 以及其他請求。上述每種請求都作為異步操作進行發送。
HttpResponseMessage 類用于聲明從 HTTP 請求接收到的 HTTP 響應消息。HTTP 消息由 IETF 在 RFC 2616 中進行定義。
HttpContent 類是用于聲明 HTTP 實體正文和內容標題的基類。 在這種情況下,HttpContent 用于聲明 HTTP 響應。
以下示例使用 .NET Framework 4.0 的 C#。同時你必須對 RFC 2616 中詳細描述的 HTTP 請求有基本的了解。
一、 創建新項目
1. 打開 Microsoft Visual Studio 2010,然后從“文件”菜單中選擇“新建項目”。在模板列表中,選擇 Visual C#。在該區域下面,選擇“Windows 應用程序應用”,然后選擇“空白應用程序”。將該應用程序命名為 winHttpClientBase,然后單擊“確定”。
2. 添加Microsoft HTTP Client Libraries的引用如下圖1,圖2,圖3,圖4。
圖1
圖2
圖3
圖4
二、設置啟用網絡訪問的功能
需要為應用設置網絡功能,以啟用家庭網絡或工作網絡以及 Internet 的訪問。你需要為你的應用啟用網絡功能,因為客戶端需要連接到因特網上的 Web Service。
對于使用 HttpClient 連接到另一臺計算機上 Web Service的應用,該應用將需要設置網絡功能。
三、添加 Windows 控件
在本小節中,我們將在添加顯示數據的控件和內容,每個控件的大小和位置,我們的用戶界面如下。
本示例使用了簡單的 Windows 控件,包括:
o 包含Label 標簽、輸入 URI 地址的 TextBox和用于啟動異步請求的Button(請求) 。
o 包一個顯示狀態與狀態代碼的兩個Lable與TextBox。
o 包一個顯示請求結果的TextBox。用于顯示從 Web 服務接收到的信息。在此示例中,HTTP GET 操作的結果會以包含 HTML 標記的純文本顯示。
四、創建 HttpClient,發送 GET 請求并檢索響應
以下代碼將首先創建 HttpClient 對象。
1. 首先創建 HttpClient 對象。我們還在 HttpClient 對象上設置兩個屬性。
HttpClient.MaxResponseContentBufferSize 屬性的默認值是整數的最大值。為了限制應用作為來自 Web 服務的響應接受的數據量,我們將此屬性設置為一個較小的值。
默認情況下,HttpClient 對象不會將用戶代理標識頭隨 HTTP 請求一起發送到 Web 服務。某些 HTTP 服務器(包括某些 Microsoft Web 服務器)要求從客戶端發送的 HTTP 請求附帶用戶代理標識頭,并且如果沒有標識頭,則返回錯誤。為了避免這些錯誤,使用 HttpClient.DefaultRequestHeaders 屬性添加了用戶代理標頭。
2. 打開 Form1.cs 文件。然后將如下代碼添加到該文件中。
private void btnRequest_Click(object sender, EventArgs e) { Init(); } private HttpClient httpClient; public void Init() { this.InitializeComponent(); httpClient = new HttpClient(); // Limit the max buffer size for the response so we don't get overwhelmed httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); }
3. 發送 GET 請求并檢索響應。
在單擊“請求”按鈕之后, txtStatusText和 txtMsg文本框中的文本將被更新,然后應用程序使用txtUrl文本框中的 URI 地址發送 HTTP GET 請求并等待響應。如果發生錯誤或異常,結果會顯示在 txtStatusText文本框中。如果沒有錯誤發生,則來自該 Web 服務的響應將顯示在 txtMsg文本框中。
如果是使用vs 2012與net 4.5 則可以在 C# 和 Visual Basic 中使用 await 關鍵字時,發送 GET 請求并異步檢索響應的代碼與我們用于同步完成該操作的代碼相似。只有在該方法被定義為 async 時,才能使用 await 關鍵字。
如果 Web 服務器返回 HTTP 錯誤狀態代碼,則 HttpResponseMessage.EnsureSuccessStatusCode 方法將引發異常。 如果發生錯誤,則對任何異常使用 try/catch 塊,并在 txtStatusText 文本框中顯示異常信息。在 try 塊中,顯示 Web 服務所返回的狀態(txtStatusText)和狀態代碼(txtStatusCode)。
HttpResponseMessage.Content 屬性聲明 HTTP 響應的內容。HttpContent.ReadAsStringAsync 方法將 HTTP 內容作為異步操作寫入到字符串中。 為了方便顯示,我們將所返回的 HTML 文本中的所有 <br> 標記都替換成了新行。
private void GetHtml() { try { string responseBodyAsText; txtMsg.Text = ""; txtStatusText.Text = "Waiting for response ..."; var task = httpClient.GetAsync(new Uri(txtUrl.Text)); task.Result.EnsureSuccessStatusCode(); //var result = task.Result.Content.ReadAsStringAsync(); HttpResponseMessage response = task.Result; txtStatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine; var result = response.Content.ReadAsStringAsync(); responseBodyAsText = result.Result; responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines txtMsg.Text = responseBodyAsText; } catch (HttpRequestException hre) { txtStatusText.Text = hre.ToString(); } catch (Exception ex) { // For debugging txtStatusText.Text = ex.ToString(); } }
如果使用 System.Net.Http 命名空間中的 HttpClient 和相關類的應用用于下載大量數據(50M 或更多),則該應用應流式傳輸這些下載內容并且不使用默認緩沖。如果使用了默認緩沖,則客戶端內存使用量將變得非常大,這可能會導致大幅度降低性能。
當 HttpClient 類和相關類的成員檢測到無效的統一資源標識符 (URI) 時,則將引發 UriFormatException 此例外不可以在 Windows 應用商店應用中使用。若要在這種情況下捕獲此例外,請為 FormatException 編寫捕獲語句。
五、小結
在本文中,我們已了解如何使用 HttpClient 類向 Web 服務發送 GET 請求以及如何使用 HttpResponseMessage 和 HttpContent 類檢索響應。
HttpClientBasic 完整示例
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnRequest_Click(object sender, EventArgs e) { Init(); GetHtml(); } private void GetHtml() { try { string responseBodyAsText; txtMsg.Text = ""; txtStatusText.Text = "等待請求返回 ..."; var task = httpClient.GetAsync(new Uri(txtUrl.Text)); task.Result.EnsureSuccessStatusCode(); HttpResponseMessage response = task.Result; txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine; txtStatusText.Text = "請求返回結果如下 ..."; var result = response.Content.ReadAsStringAsync(); responseBodyAsText = result.Result; responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines txtMsg.Text = responseBodyAsText; } catch (HttpRequestException hre) { txtStatusText.Text = hre.ToString(); } catch (Exception ex) { // For debugging txtStatusText.Text = ex.ToString(); } } private HttpClient httpClient; public void Init() { httpClient = new HttpClient(); httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); } }
可以將 HttpClientHandler 類與 HttpClient 類結合使用,以設置有關 HTTP 請求的選項。
文章列表