.NET Core开发日志——HttpClientFactory
當需要向某特定URL地址發送HTTP請求并得到相應響應時,通常會用到HttpClient類。該類包含了眾多有用的方法,可以滿足絕大多數的需求。但是如果對其使用不當時,可能會出現意想不到的事情。
博客園官方團隊就遇上過這樣的問題,國外博主也記錄過類似的情況,YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE。
究其緣由是一句看似正確的代碼引起的:
using(var client = new HttpClient())對象所占用資源應該確保及時被釋放掉,但是,對于網絡連接而言,這是錯誤的。
原因有二,網絡連接是需要耗費一定時間的,頻繁開啟與關閉連接,性能會受影響;再者,開啟網絡連接時會占用底層socket資源,但在HttpClient調用其本身的Dispose方法時,并不能立刻釋放該資源,這意味著你的程序可能會因為耗盡連接資源而產生預期之外的異常。
所以比較好的解決方法是延長HttpClient對象的使用壽命,比如對其建一個靜態的對象:
private static HttpClient Client = new HttpClient();但從程序員的角度來看,這樣的代碼或許不夠優雅。
所以在.NET Core 2.1中引入了新的HttpClientFactory類。
它的用法很簡單,首先是對其進行Ioc的注冊:
public void ConfigureServices(IServiceCollection services){services.AddHttpClient();services.AddMvc(); }然后通過IHttpClientFactory創建一個HttpClient對象,之后的操作如舊,但不需要擔心其內部資源的釋放:
第一眼瞧去,可能不明白AddHttpClient方法與IHttpClientFactory有什么關系,但查到其源碼后就能一目了然:
它的內部為IHttpClientFactory接口綁定了DefaultHttpClientFactory類。
再看IHttpClientFactory接口中關鍵的CreateClient方法:
HttpClient的創建不再是簡單的new HttpClient(),而是傳入了兩個參數:HttpMessageHandler handler與bool disposeHandler。disposeHandler參數為false值時表示要重用內部的handler對象。handler參數則從上一句的代碼可以看出是以名稱為鍵值從一字典中取出,又因為DefaultHttpClientFactory類是通過TryAddSingleton方法注冊的,也就意味著其為單例,那么這個內部字典便是唯一的,每個鍵值對應的ActiveHandlerTrackingEntry對象也是唯一,該對象內部中就包含著handler。
下一句代碼StartHandlerEntryTimer(entry);?開啟了ActiveHandlerTrackingEntry對象的過期計時處理。默認過期時間是2分鐘。
先是將ActiveHandlerTrackingEntry對象傳入新的ExpiredHandlerTrackingEntry對象。
public ExpiredHandlerTrackingEntry(ActiveHandlerTrackingEntry other){Name = other.Name;_livenessTracker = new WeakReference(other.Handler);InnerHandler = other.Handler.InnerHandler; }在其構造方法內部,handler對象通過弱引用方式關聯著,不會影響其被GC釋放。
然后新建的ExpiredHandlerTrackingEntry對象被放入專用的隊列。
最后開始清理工作,定時器的時間間隔設定為每10秒一次。
上述方法核心是判斷是否handler對象已經被GC,如果是的話,則釋放其內部資源,即網絡連接。
回到最初創建HttpClient的代碼,會發現并沒有傳入任何name參數值。這是受益于HttpClientFactoryExtensions類的擴展方法。
在傳入name參數值時,還可以傳入一些配置信息:
相關文章:
.Net Core開發日志——Global Tools
.Net Core開發日志——Peachpie
.NET Core開發日志——Middleware
.Net Core Cors中間件解析
.NET Core開發日志——Runtime IDentifier
.NET Core開發日志——從ASP.NET Core Module到KestrelServer
原文地址:https://www.cnblogs.com/kenwoo/p/9333042.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的.NET Core开发日志——HttpClientFactory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net core redis 驱动推荐
- 下一篇: 【asp.net Core MVC +