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


Asp.Net Web API 導航

    Asp.Net Web API第一課:入門http://www.cnblogs.com/aehyok/p/3432158.html

      Asp.Net Web API第二課:CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html

      Asp.Net Web API第三課:.NET客戶端調用Wep API http://www.cnblogs.com/aehyok/p/3439698.html

前言

消息處理器是一個接收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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM