HttpClient做爲.net4.5新增的Http庫除了對於async/await形式的異步支持外,還向咱們展現了其強大的擴展能力。 html
【類庫的設計】 設計模式
讓咱們先看下Httpclient的設計圖:網絡
圖中咱們能夠清晰的看出對於HttpClient庫而言其請求的過程:架構
從Request發起,通過DelegatingHanlder處理後,進入InnerHandler,數據返回後再從Inner Handler 返回到Delegating Hanlder進行處理,最後返回結果。 異步
從設計角度來說,HttpClient庫提供了強大的擴展性,使用者不須要任何繼承便可完成對HttpClient的擴展(若是對設計模式熟悉,能夠清楚的看出這裏用到了裝飾器模式) async
先讓咱們來看一段實際的代碼宏觀的對HttpClient很方便的擴展有更具體的認識: 工具
咱們首先經過代碼給Httpclient加一個DebugLog功能: spa
那麼咱們須要按下面的方式來定義: .net
上面代碼的幾點說明: 設計
一、對於HttpClient這個類而言,其自己並不會進行實際的網絡請求收發處理,咱們應將其理解成一個容器、一箇中繼者,實際的網絡請求核心在HttpClientHanlder中,也就是前面圖中對應的Inner Handler。
二、咱們本身定義了一個LoggingHandler,這個類對應Delegating Handler 是咱們自定義的、裝飾在Inner Handler外的Handler
三、DelegatingHandler重載了SendAsync,在其內部調用了InnerHandler的SendAsync方法,如此咱們即可以在實際請求發出,以及返回後進行各類統一的處理,總結起來還是上面圖中畫出的,逐層調用。
一個例子可能不足以讓人理解透徹,咱們能夠展開思路,爲httpClient定製出更多的功能,好比下面的例子:
爲httpClient擴展出失敗重試的邏輯:實際使用方式
在實際使用過程當中咱們能夠定義一個方法來統一配置httpClient:
一、注意自定義的Handler的執行順序,是從左往右依次調用
能夠更深刻的參考下面的文章:http://chimera.labs.oreilly.com/books/1234000001708/ch14.html
【總結】
HttpClient這一套類庫的設計相比以前而言很是的精妙,能夠做爲典型的設計模式教材了,而在實際開發過程當中也爲每一個開發人員提供了網絡層架構的極大遍歷,若是你要與.net4.5打交道,那麼是時候更新你的工具箱了