『技術群里聊些啥』HttpClient 如何判斷是同一終結點

前言

官方文檔對 HttpClientHandler.MaxConnectionsPerServer 屬性有如下說明:

獲取或設置使用 HttpClient 對象發出請求時允許的最大并發連接數(每個服務器終結點)。請注意,該限制針對每個服務器終結點,例如,值為 256 表示允許 256 個到 http://www.adatum.com/ 的并發連接,以及另外 256 個到 http://www.adventure-works.com/ 的并發連接。

有網友在交流群中詢問,終結點到底指的啥,怎么判斷是同一終結點?

84df382bdb13d7f344e940cf3b88ff39.png

讓我們通過源碼來看看吧!

源碼分析

HttpClientHandler.MaxConnectionsPerServer

HttpClientHandler.MaxConnectionsPerServer 的實現代碼如下:

public?int?MaxConnectionsPerServer
{get?=>?_underlyingHandler.MaxConnectionsPerServer;set?=>?_underlyingHandler.MaxConnectionsPerServer?=?value;
}

實際使用的是_underlyingHandler.MaxConnectionsPerServer。而_underlyingHandlerSocketsHttpHandler類的實例:

using?HttpHandlerType?=?System.Net.Http.SocketsHttpHandler;private?readonly?HttpHandlerType?_underlyingHandler;

SocketsHttpHandler.MaxConnectionsPerServer

SocketsHttpHandler.MaxConnectionsPerServer 的實現代碼如下:

public?int?MaxConnectionsPerServer
{get?=>?_settings._maxConnectionsPerServer;set{..._settings._maxConnectionsPerServer?=?value;}
}

實際使用的是_settings._maxConnectionsPerServer。那么,誰在使用這個設置值呢?

HttpConnectionPool

我們定位到了HttpConnectionPool的構造函數:

public?HttpConnectionPool(HttpConnectionPoolManager?poolManager,?HttpConnectionKind?kind,?string??host,?int?port,?string??sslHostName,?Uri??proxyUri)
{..._maxHttp11Connections?=?Settings._maxConnectionsPerServer;...
}

HttpConnectionPool的作用就是,提供到同一終結點的連接池。看來我們離真相越來越近了。

///?<summary>Provides?a?pool?of?connections?to?the?same?endpoint.</summary>
internal?sealed?class?HttpConnectionPool?:?IDisposable

HttpConnectionPoolManager

HttpConnectionPool的構造函數只在HttpConnectionPoolManager類中被調用:

public?ValueTask<HttpResponseMessage>?SendAsyncCore(HttpRequestMessage?request,?Uri??proxyUri,?bool?async,?bool?doRequestAuth,?bool?isProxyConnect,?CancellationToken?cancellationToken)
{HttpConnectionKey?key?=?GetConnectionKey(request,?proxyUri,?isProxyConnect);HttpConnectionPool??pool;while?(!_pools.TryGetValue(key,?out?pool)){pool?=?new?HttpConnectionPool(this,?key.Kind,?key.Host,?key.Port,?key.SslHostName,?key.ProxyUri);

可以看到,HttpConnectionPool是從ConcurrentDictionary _pools 中獲取的,而key的值是HttpConnectionKey類型。

HttpConnectionKey

而 HttpConnectionKey 是這樣判斷是否相等的:

public?readonly?HttpConnectionKind?Kind;
public?readonly?string??Host;
public?readonly?int?Port;
public?readonly?string??SslHostName;?????//?null?if?not?SSL
public?readonly?Uri??ProxyUri;
public?readonly?string?Identity;public?bool?Equals(HttpConnectionKey?other)?=>Kind?==?other.Kind?&&Host?==?other.Host?&&Port?==?other.Port?&&ProxyUri?==?other.ProxyUri?&&SslHostName?==?other.SslHostName?&&Identity?==?other.Identity;

結論

由上面的代碼,我們可以得出如下結論:

如果連接類型、服務器地址、服務器端口、代理(如果有)全部相同,則認為是同一終結點

添加微信號【MyIO666】,邀你加入技術交流群

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Envi風暴】Envi 5.3 SP1經典安裝手把手圖文教程(含補丁文件)

Envi 5.3具有傳感器和數據支持、圖像處理和顯示、用戶界面、二次開發等新功能,本文講解Envi 5.3 SP1完全安裝教程。 下載后的軟件包目錄如下所示: 目錄 一、Envi 5.3 SP1安裝 二、Envi 5.3 SP1下載地址 一、Envi 5.3 SP1安裝 點擊IDL_ENVI5.3 SP1win64.exe,開始安裝,…

apache php url重寫語法,apache url重寫實現偽靜態

前段時間項目為了配合seo的工作&#xff0c;把現有的php網站改成靜態頁面&#xff0c;剛拿到需求時候第一感覺就是用靜態頁面啊&#xff0c;可是看了一會以后發現頁面有點多4、50個&#xff0c;沒辦法就用比較簡單的url重寫(apache的)吧&#xff0c;去掉這個前面的#,啟用它Load…

Android之用java的socket寫服務器提示java.net.BindException: Address already in use

1 問題 在Android activity里面Java socket服務器,然后關閉activity再打開activity開啟服務的時候提示錯誤如下 java.net.BindException: Address already in use 很明顯這個,IP和端口的的socket已經使用了,我們只需要在關閉activity的時候關閉serverSocket就行了。 2 解…

《看聊天記錄都學不會C語言?太菜了吧》(10)程序媛聰明絕頂了

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

List 集合轉換為String

開發中會用到把 List<string> 的內容拼接成以逗號分隔的字符串的形式,現總結如下&#xff1a; 方法一: public String listToString(List list, char separator) { StringBuilder sb new StringBuilder(); for (int i 0; i < list.size(); i) { …

[leetcode]Pascal#39;s Triangle II

問題敘述性說明&#xff1a; Given an index k, return the kth row of the Pascals triangle. For example, given k 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 思路&#xff1a; the mth element of the nth row of th…

遙感方法研究張掖市1999-2010年土地利用變化

【方法思路】:本文選取張掖地區兩期影像(Landsat 1999-07-07,2010-09-07),用監督分類方法獲取各期土地利用類型,與已有的土地利用現狀矢量圖(landuse2000)相疊加,通過對比分析,進而得出張掖市1999-2010年間土地利用變化情況。 一、實驗數據 采用Landsat Tm影像,原始…

【MongoDB】遞歸獲取字段更新表達式,更新復雜數據類型對象

在實際更新Mongo對象時發現&#xff0c;原有的更新代碼無法更新復雜的數據類型對象。恰好看到張占嶺老師有對該方法做相關的改進&#xff0c;因此全抄了下來。 總的核心思想就是運用反射與遞歸&#xff0c;對對象屬性一層一層挖掘下去&#xff0c;循環創建父類及之類的更新表達…

java openxml 操作 word,openxml word轉成xml

word2007無法打開Office Open XML 文檔由于種種原因&#xff0c;如程序安裝錯誤、注冊表被修改&#xff0c;或系統被病毒侵害等。有時候會造成WORD 2007無法打開.DOC文檔的問題&#xff0c;常規的處理辦法(右鍵選擇“打開方式”)無效。可以試試如下的方法 &#xff1a;1.打開注…

聊一聊CLR源碼中的 #define 是怎么玩的

一&#xff1a;背景 如果大家看過 CLR 源碼&#xff0c;會發現里面有很多 #define 宏定義,比如說 fusionhelpers.hpp 頭文件里。如果你不熟悉 C &#xff0c;看到這些 #define 應該會很暈的&#xff0c;這篇我們就來簡單聊聊 define 的玩法&#xff0c;其實說白了很簡單, #defi…

《看聊天記錄都學不會C語言?太菜了吧》(11)2分鐘領悟數組

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

Android之android8.1打開熱點提示UID 10140 does not have Location permission和Location mode is enabled.

1 問題 在三星安卓8.1版本手機上,打開熱點 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {@TargetApi(Build.VERSION_CODES.O…

基于CentOS 7配置Nginx正向代理

Nginx是一款以輕量級、低內存開銷、支持緩存、支持反向代理&#xff0c;負載均衡&#xff0c;電子郵件服務而著稱。對于鮮為人知的是&#xff0c;它還可以作為一個簡單易用的正向代理服務器。本文簡要描述這個正向代理功能并給出演示&#xff0c;供大家參考。 有關Nginx的安裝請…

【ArcObject開發】實驗:ArcObject地圖開發基本操作

ArcObjects,是基于Microsoft COM技術所構建的一系列COM組件集,是在ArcGIS Desktop平臺基礎上的二次開發,開發語言為VBA(Vistal Basic for Application)。下面將AO開發的中的一系統基本操作做一簡單的說明。 下圖是功能主面板,有三個主要功能:地圖漫游、地圖制圖和創建元素…

Cocos2D中相關問題提問的幾個論壇

如果和SpriteBuilder相關可以到: http://forum.spritebuilder.com 提問. 如果是Cocos2D的問題,則可以到以下論壇詢問: http://forum.cocos2d-swift.org 你也可以到神人超多的stack overflow去提問: http://stackoverflow.com

T T[] toArray(T[] a);

<T> T[] toArray(T[] a); String[] a list.toArray(new String[list.length()]);轉載于:https://www.cnblogs.com/zjlog/p/5582322.html

[Python MoviePy 音視頻開發零基礎到實戰] 一、用6條代碼為你的視頻裁剪以及添加水印

一、MoviePy 安裝及配置 在 Python 有一個音視頻開發模塊 MoviePy&#xff0c;MoviePy 依賴于 FFmepg&#xff0c;使用 MoviePy 可以對音視頻進行編輯&#xff1b;例如視頻合成、視頻處理、視頻特效等。 在 Python 下直接使用 pip 工具進行安裝即可&#xff1a; pip install…

C# 使用ILogger接口編寫日志

.NET 有幾種不同的日志記錄和跟蹤工具&#xff0c;還有許多不同的第三方日志記錄程序。嘗試將一個應用程序從一種日志記錄技術更改為另一種日志記錄技術不是一件容易的事情&#xff0c;因為日志記錄 API 的使用分布在整個源代碼中。要使日志記錄獨立于任何日志記錄技術&#xf…

html頁面調用php常量,js中的常量變量以及html文檔三種引入js的方式

js 是基于事件驅動的異步單線程的腳本編程語言&#xff0c;它的全稱是 JavaScript&#xff0c;雖然里邊有個 java 字樣&#xff0c;但是和 java 編程語言一點關系都沒有。它是一種腳本語言&#xff0c;基于解釋器執行&#xff0c;它是邊解釋便執行的語言。瀏覽器控制臺 Console…

Android之ScrollView設置了高度(android:layout_height=“match_parent“)但里面的組件不能充滿問題

1 問題 寫了ScrollView控件&#xff0c;設置了高度(android:layout_height"match_parent")&#xff0c;但是里面的組件不能填充它&#xff0c;感覺就像ScrollView高度設置成了wrap_content 2 解決辦法 在ScrollView里面添加如下屬性即可 android:fillViewport&quo…