標籤:
前言
訊息處理器是一個接收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訊息處理器