Asp.Net Web API 2第四課——HttpClient訊息處理器

來源:互聯網
上載者:User

標籤:

 

前言

訊息處理器是一個接收HTTP請求,並返回HTTP響應的一個類。

比較有代表性的時,一系列的訊息處理被連結在一起。第一個處理器接收HTTP請求,做一些處理,然後將此請求傳給下一個處理器。在某個點上,這個響應被建立,被進行回溯。這種模式就叫做委託處理器。

在用戶端,HTTPClient類使用一個訊息處理器來處理請求。預設的處理器是HTTPClientHandler,它通過網路發送請求,並從伺服器上獲得響應。你可以把自訂訊息處理器插入到用戶端管道中。

Asp.Net Web API也可以使用服務端的訊息處理器。更多的資訊請參考"HTTP訊息處理器"(暫未實現。)

自訂訊息處理器

 要編寫一個訊息處理器,需要從System.Net.Http.DelegatingHandler進行派生,並重寫SendAsync方法。以下是該方法的簽名:

System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken);

這個方法以HttpRequestMessage參數作為輸入,並非同步地返回一個HttpResponseMessage。一種典型的實現如下:

  1.處理請求訊息。

  2.調用base.SendAsync將請求發送給內部處理器。

  3.內部處理器返回一條響應訊息。(這一步是非同步)

  4.處理響應,並把他返回給調用者。

以下樣本展示了一個訊息處理器,它添加了一個自訂的標題給外部的請求。

    public class MessageHandler : DelegatingHandler    {        private int _count = 0;        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)        {            _count++;            request.Headers.Add("X-Custom-Header", _count.ToString());            return base.SendAsync(request, cancellationToken);        }    }

base.SendAsync的調用是非同步。如果處理器在調用之後還要做一些工作,需使用await關鍵字,以便在方法完成之後繼續執行。

以下樣本展示了一個對錯誤碼進行日誌的處理器。如何進行日誌沒多大關係,但此例展示了如何得到處理器內部的響應。

    public class LoggingHandler : DelegatingHandler     {         StreamWriter _writer;         public LoggingHandler(Stream stream)        {             _writer = new StreamWriter(stream);        }        protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)        {            var response = await base.SendAsync(request, cancellationToken);            if (!response.IsSuccessStatusCode)             {                 _writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri,(int)response.StatusCode, response.Headers.Date);             }             return response;         }        protected override void Dispose(bool disposing)         {             if (disposing)             {                 _writer.Dispose();             }             base.Dispose(disposing);         }     }

將訊息處理器添加到用戶端管線

 要將自訂處理器添加到HttpClient,需使用HttpClientFactory.Create方法:

HttpClient client = HttpClientFactory.Create(new MessageHandler());

訊息處理器是按照它們傳遞給Create方法中的順序來調用的。因此處理器是內嵌的,響應訊息以反方向傳遞。即,最後一個處理器首先得到響應訊息。

總結

 本文主要講解HTTPClient訊息處理器。涉及到的代碼在文中都有過展示,暫時就不進行上傳了。

本文參考連結http://www.asp.net/web-api/overview/web-api-clients/httpclient-message-handlers

Asp.Net Web API 2第四課——HttpClient訊息處理器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.