中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Core開發日志中的HttpClientFactory如何理解

發布時間:2022-01-05 16:28:32 來源:億速云 閱讀:127 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關.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對象,之后的操作如舊,但不需要擔心其內部資源的釋放:

.NET Core開發日志中的HttpClientFactory如何理解

第一眼瞧去,可能不明白AddHttpClient方法與IHttpClientFactory有什么關系,但查到其源碼后就能一目了然:

.NET Core開發日志中的HttpClientFactory如何理解

它的內部為IHttpClientFactory接口綁定了DefaultHttpClientFactory類。

再看IHttpClientFactory接口中關鍵的CreateClient方法:.NET Core開發日志中的HttpClientFactory如何理解

.NET Core開發日志中的HttpClientFactory如何理解

HttpClient的創建不再是簡單的new HttpClient(),而是傳入了兩個參數:HttpMessageHandler handler與bool disposeHandler。disposeHandler參數為false值時表示要重用內部的handler對象。handler參數則從上一句的代碼可以看出是以名稱為鍵值從一字典中取出,又因為DefaultHttpClientFactory類是通過TryAddSingleton方法注冊的,也就意味著其為單例,那么這個內部字典便是唯一的,每個鍵值對應的ActiveHandlerTrackingEntry對象也是唯一,該對象內部中就包含著handler。

下一句代碼StartHandlerEntryTimer(entry); 開啟了ActiveHandlerTrackingEntry對象的過期計時處理。默認過期時間是2分鐘。

.NET Core開發日志中的HttpClientFactory如何理解

先是將ActiveHandlerTrackingEntry對象傳入新的ExpiredHandlerTrackingEntry對象。

public ExpiredHandlerTrackingEntry(ActiveHandlerTrackingEntry other){
    Name = other.Name;

    _livenessTracker = new WeakReference(other.Handler);
    InnerHandler = other.Handler.InnerHandler;
}

在其構造方法內部,handler對象通過弱引用方式關聯著,不會影響其被GC釋放。

然后新建的ExpiredHandlerTrackingEntry對象被放入專用的隊列。

最后開始清理工作,定時器的時間間隔設定為每10秒一次。

.NET Core開發日志中的HttpClientFactory如何理解

上述方法核心是判斷是否handler對象已經被GC,如果是的話,則釋放其內部資源,即網絡連接。

回到最初創建HttpClient的代碼,會發現并沒有傳入任何name參數值。這是受益于HttpClientFactoryExtensions類的擴展方法。

.NET Core開發日志中的HttpClientFactory如何理解

在傳入name參數值時,還可以傳入一些配置信息:

.NET Core開發日志中的HttpClientFactory如何理解

上述就是小編為大家分享的.NET Core開發日志中的HttpClientFactory如何理解了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

徐汇区| 富宁县| 绥阳县| 黎川县| 高雄市| 寻甸| 岗巴县| 巴南区| 旺苍县| 马山县| 巴青县| 当阳市| 马公市| 治县。| 南郑县| 高安市| 仁怀市| 承德县| 资源县| 陆川县| 东明县| 酒泉市| 鲜城| 吉水县| 普格县| 石阡县| 岗巴县| 富平县| 铜川市| 越西县| 蕉岭县| 兴海县| 丰原市| 龙里县| 乐昌市| 海南省| 锡林浩特市| 宾川县| 龙口市| 哈巴河县| 西昌市|