HttpClient作為.net4.5新增的Http庫除了對于async/await形式的異步支持外,還向我們展示了其強大的擴展能力。
【類庫的設計】
讓我們先看下Httpclient的設計圖:

圖中我們可以清晰的看出對于HttpClient庫而言其請求的過程:
從Request發起,經過DelegatingHanlder處理后,進入InnerHandler,數據返回后再從Inner Handler 返回到Delegating Hanlder進行處理,最后返回結果。
從設計角度來講,HttpClient庫提供了強大的擴展性,使用者不需要任何繼承即可完成對HttpClient的擴展(如果對設計模式熟悉,可以清楚的看出這里用到了裝飾器模式)
先讓我們來看一段實際的代碼宏觀的對HttpClient很方便的擴展有更具體的認識:
我們首先通過代碼給Httpclient加一個DebugLog功能:
那么我們需要按下面的方式來定義:


上面代碼的幾點說明:
1、對于HttpClient這個類而言,其本身并不會進行實際的網絡請求收發處理,我們應將其理解成一個容器、一個中繼者,實際的網絡請求核心在HttpClientHanlder中,也就是前面圖中對應的Inner Handler。
2、我們自己定義了一個LoggingHandler,這個類對應Delegating Handler 是我們自定義的、裝飾在Inner Handler外的Handler
3、DelegatingHandler重載了SendAsync,在其內部調用了InnerHandler的SendAsync方法,如此我們便可以在實際請求發出,以及返回后進行各種統一的處理,總結起來仍是上面圖中畫出的,逐層調用。
一個例子可能不足以讓人理解透徹,我們可以展開思路,為httpClient定制出更多的功能,比如下面的例子:
為httpClient擴展出失敗重試的邏輯:實際使用方式

在實際使用過程中我們可以定義一個方法來統一配置httpClient:

1、注意自定義的Handler的執行順序,是從左往右依次調用
可以更深入的參考下面的文章:http://chimera.labs.oreilly.com/books/1234000001708/ch14.html
【總結】
HttpClient這一套類庫的設計相比之前而言非常的精妙,可以作為典型的設計模式教材了,而在實際開發過程中也為每個開發人員提供了網絡層架構的極大遍歷,如果你要與.net4.5打交道,那么是時候更新你的工具箱了
新聞熱點
疑難解答