文章出處

 對于System.Net.Http的學習(一)——System.Net.Http 簡介

 

對于System.Net.Http的學習(二)——使用 HttpClient 進行連接

 

如何使用 HttpClient 處理程序

  將 HttpClientHandler 類與 System.Net.Http 命名空間中的 HttpClient 類結合使用,以向 Web Service發送 GET 請求并檢索響應。

  HttpClient 類用于通過 HTTP 發送和接收基本要求。它提供了一個用于從 URI 所標識的資源發送 HTTP 請求和接收 HTTP 響應的基類。該類可用來向 Web 服務發送 GET、PUT、POST、DELETE 以及其他請求。上述每種請求都作為異步操作進行發送。

  HttpClientHandler 類是 HttpClient 的默認消息處理程序。HttpClientHandler 類以及從該類派生的類讓開發人員可以對 HTTP 請求配置從代理到身份驗證的一系列選項。

一: 創建新項目

  打開 Microsoft Visual Studio 2010,然后從“文件”菜單中選擇“新建項目”。在模板列表中,選擇 Visual C#。在該區域下面,選擇“Windows”,然后選擇“Windows窗體應用程序”。將該應用程序命名為 HttpClientHandlerSample,然后單擊“確定”。

二: 添加 WINDOWS UI 

   在本節中,我們將在 Windows Form 中定義應用的布局,以指定應用中每個對象的大小和位置。 通過添加顯示數據的控件和內容,我們已經完成了應用的用戶界面。如下圖。

 

 

三: 創建 HttpClientHandler,發送 GET 請求并檢索響應

  以下示例代碼將首先創建 HttpClientHandler 對象。該代碼還將對該對象設置一個屬性,并使用 HttpClientHandler 創建一個 HttpClient 對象。

  1. 首先創建 HttpClientHandler 對象。將 AllowAutoRedirect 屬性設置為 false。此示例顯示了如何使用 HttpClientHandler 屬性來設置有關 HTTP 請求的選項。

  AllowAutoRedirect 屬性指示 HttpClientHandler 對象的請求是否應遵循重定向響應。此屬性的默認值是 true。如果此屬性被設置為 false,則不會遵循 Web 服務的重定向請求。

  然后,使用 HttpClientHandler 對象創建 HttpClient 對象。我們還在 HttpClient 對象上設置兩個屬性。HttpClient.MaxResponseContentBufferSize 屬性的默認大小是整數的最大大小。為了限制應用作為來自 Web 服務的響應接受的數據量,我們將此屬性設置為一個較小的值。

  默認情況下,HttpClient 對象不會將用戶代理標頭隨 HTTP 請求一起發送到 Web 服務。某些 HTTP 服務器(包括某些 Microsoft Web 服務器)要求從客戶端發送的 HTTP 請求附帶用戶代理標頭,并且如果沒有標頭,則返回錯誤。為了避免這些錯誤,示例使用 HttpClient.DefaultRequestHeaders 屬性添加了用戶代理標頭。

  打開 Form1.cs 文件,然后將如下代碼添加到該文件中。

 

   private HttpClient httpClient;

    private HttpClientHandler handler;

 

    public void Init()

    {

        txtUrl.Text = "http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl";

        handler = new HttpClientHandler();

        handler.AllowAutoRedirect=false; 

 

        httpClient = new HttpClient(handler);

 

        // Limit the max buffer size for the response so we don't get overwhelmed

        httpClient.MaxResponseContentBufferSize = 256000;

        // Add a user-agent header

        httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

    }

 

   2. 發送 GET 請求并檢索響應。

  在單擊“請求”按鈕之后,txtStatusText 和 txtMsg兩個文本框中的文本將被更新,然后使用輸入到txtUrl文本框中的 URI 地址發送 HTTP GET 請求并等待響應。如果發生錯誤或異常,錯誤信息會顯示在 txtStatusText文本框中。如果沒有錯誤發生,則來自該 Web 服務的響應將顯示在 txtMsg文本框中。

  說明:

  在  visual studio 2012 中的 C# 和 Visual Basic 中可以使用 await 關鍵字時,發送 GET 請求并異步檢索響應的代碼與我們用于同步完成該操作的代碼相似。只有在該方法被定義為 async 時,才能使用 await 關鍵字。

  如果 Web 服務器返回 HTTP 錯誤狀態代碼,則 HttpResponseMessage.EnsureSuccessStatusCode 方法將引發異常。 如果發生錯誤,則對任何異常使用 try/catch 塊,并把錯誤信息顯示在txtStatusText 文本框中的異常消息。在 try 塊中,顯示 Web 服務所返回的狀態和響應。

  HttpResponseMessage.Content 屬性聲明 HTTP 響應的內容。HttpContent.ReadAsStringAsync 方法將 HTTP 內容作為異步操作寫入到字符串中。 

 

  

    private void btnRequest_Click(object sender, EventArgs e)

    {

           try

            {

                

                txtMsg.Text=string.Empty;

                txtStatusText.Text = "等待請求返回 ...";

                var task = httpClient.GetAsync(txtUrl.Text);

                task.Result.EnsureSuccessStatusCode();

                HttpResponseMessage response = task.Result;

                

             

                txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;

                txtStatusText.Text = "請求返回結果如下 ...";

                var result = response.Content.ReadAsStringAsync();

               string 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)

            {


                txtStatusText.Text = ex.ToString();

            }

 

    }

 

 

 

 

 

備注

在本文中,我們介紹了如何將 HttpClientHandler 與 HttpClient 類結合使用,以向 Web 服務發送 GET 請求,以及如何使用 HttpResponseMessage 和 HttpContent 類檢索響應。HttpClientHandler 允許應用設置有關 HTTP 請求的選項。

有一些 HTTP 消息處理程序可以與 HttpClient 類結合使用。

  • HttpClientHandler - 文中 HttpClient 所用的默認消息處理程序。
  • MessageProcessingHandler - 一種基本的 HTTP 消息處理程序。這是最容易進行派生的處理程序,應該作為大多數自定義處理程序的起點。
  • DelegatingHandler - 一種基本的 HTTP 處理程序,可將 HTTP 響應消息的處理委派給其他處理程序。

 

完整示例:

 

 

HttpClientHandler 示例
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Http;

namespace HttpClientHandlerSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Init();
        }

          private HttpClient httpClient;
    private HttpClientHandler handler;

    public void Init()
    {
        txtUrl.Text = "http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl";
        handler = new HttpClientHandler();
        handler.AllowAutoRedirect=false; 

        httpClient = new HttpClient(handler);

        // Limit the max buffer size for the response so we don't get overwhelmed
        httpClient.MaxResponseContentBufferSize = 256000;
        // Add a user-agent header
        httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    }

    private void btnRequest_Click(object sender, EventArgs e)
    {
           try
            {
                
                txtMsg.Text=string.Empty;
                txtStatusText.Text = "等待請求返回 ...";
                var task = httpClient.GetAsync(txtUrl.Text);
                task.Result.EnsureSuccessStatusCode();
                HttpResponseMessage response = task.Result;
                
             
                txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
                txtStatusText.Text = "請求返回結果如下 ...";
                var result = response.Content.ReadAsStringAsync();
               string 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)
            {
                txtStatusText.Text = ex.ToString();
            }
    }
    }
}

 

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()