精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.NET Core HttpClient請求異常分析

開發 后端
最近項目上每天間斷性捕獲到HttpClient請求異常,感覺有點奇怪,于是乎觀察了兩三天,通過日志以及對接方溝通確認等等,查看對應版本源碼,嘗試添加部分配置發布后,觀察十幾小時暫無異常情況出現,貌似問題已得到解決,若有后續繼續更新。

[[403870]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky 。轉載本文請聯系JeffckyShare公眾號。

最近項目上每天間斷性捕獲到HttpClient請求異常,感覺有點奇怪,于是乎觀察了兩三天,通過日志以及對接方溝通確認等等,查看對應版本源碼,嘗試添加部分配置發布后,觀察十幾小時暫無異常情況出現,貌似問題已得到解決,若有后續繼續更新。

HttpClient來源:netstandard2.0

場景:將相關廠家地磁設備(停車進出場)推送數據,轉發至對接方。

最近一個星期經過觀察會出現兩種異常情況,一種是請求連接操作被取消,另外一種則是請求處理過程中操作被取消,具體異常信息請見如下圖

我們知道HttpClient默認超時時間為100s,但項目默認設置請求超時時間為30s,初次分析異常情況來看,請求超時導致請求連接被取消異常,首先我telnet對接方端口通暢,于是乎與對接方交涉,是否存在從請求到對接方接口有額外前置處理,以及網絡是否存在波動等等,排查得知相關猜測都予以否決,網絡無任何問題

問題排查分析

既然網絡沒有任何問題,難道是對接方即服務端處理數據量巨大,導致請求應答超時?于是乎對接方甩出幾張最近消息接收數據

從上述兩張圖來看,最多的一天也才90來萬,最近幾天請求失敗的數據大概2百來條,從我們平臺打印日志來看,每秒請求大致是10個左右,通過HTTP對接完全可以承載。

然后,因為我們將數據(JSON,數據大小幾乎可以忽略不計)轉發到對接方,對接方拿到數據后不會進行任何額外處理,直接存儲,所以我們請求超時時間30s,怎么會導致超時而引發異常呢?很奇怪

沒轍了,只能拿起終極武器,tcp抓包分析,重新學習了tcp/ip協議族一波

WireShark抓包分析

為打開分析上述pcap文件,提前安裝抓包軟件WireShark最新版本,由于軟件項目部署在Linux上,我們通過如下命令進行抓包

  1. tcpdump -i any port 1443 -w exception.pcap 

從如下抓包信息可以直接知道,對接方使用了HTTPS協議,具體請看如下圖

如圖

默認打開如上圖所示,其中time為時間戳,為找到我們指定時間點(2021-06-04 15:46:17.296),通過tab:視圖-時間顯示格式-日期和時間

接下來我們找到包文件中導致請求被取消異常的具體時間節點(2021-06-04 15:46:17.296)

在TCP協議中RST表示復位,用于異常時關閉連接。在發送RST包關閉連接時,不必等待緩沖區的包都發出去,直接丟棄緩沖區的包而發送RST包。而接收端收到RST包后,也不必發送ACK包來確認。

好像有點眉頭了,繼續往下看

好家伙,結合這張圖來看,基本上可以得出結論:原來是我們平臺主動重置了連接,緊接著又開始了多次進行三次握手連接即(SYN、SYN/ACK、ACK)

示例代碼分析

推送邏輯是在類庫中使用HttpClient,所以沒有使用HttpClientFactory,因此定義靜態變量來使用HttpClient,而非每一個請求就實例化一個HttpClient

接下來我們來詳細分析項目示例代碼并對其進行改進

  1. static class Program 
  2.     static HttpClient httpClient = CreateHttpClient(); 
  3.     static Program() 
  4.     { 
  5.         ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
  6.  
  7.         ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, error) => true
  8.     } 
  9.  
  10.     static async Task Main(string[] args) 
  11.     { 
  12.         await httpClient.PostAsync("", new StringContent("")); 
  13.     } 
  14.  
  15.     static HttpClient CreateHttpClient() 
  16.     { 
  17.         var client = new HttpClient(new HttpClientHandler 
  18.         { 
  19.             ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true 
  20.         }) 
  21.         { 
  22.             Timeout = TimeSpan.FromSeconds(30) 
  23.         }; 
  24.  
  25.         client.DefaultRequestHeaders.Accept.Clear(); 
  26.  
  27.         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
  28.         client.DefaultRequestHeaders.Add("ContentType""application/json"); 
  29.         return client; 
  30.     } 

若對接方僅使用HTTPS協議,無需驗證證書,最好是忽略證書驗證,否則有可能會引起建立驗證證書連接異常,即添加

  1. ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true 

我們觀察上述代碼,有兩個地方都對證書驗證進行了設置,一個是在靜態構造函數中ServicePointManager(簡稱SP),另外則在實例化HttpClient構造函數中即HttpClientHandler(簡稱HCH),那么這二者是否有使用上的限制呢?

在.NET Framework中,內置的HttpClient建立在HttpWebRequest之上,因此可以使用SP來配置

在.NET Core中,通過SP配置證書信息僅影響HttpWebRequest,而對HttpClient無效,需通過HCH配置來達到相同目的

所以去除在靜態構造函數中對忽略證書的配置,改為在HttpClientHandler中

  1. var client = new HttpClient(new HttpClientHandler 
  2.     ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true
  3.     SslProtocols = SslProtocols.Tls12 
  4. }) 

回到本文的話題,為什么會重置連接即主動關閉連接呢?我們已分析過,和上述配置30s超時沒有關系,主要有兩方面原因

翻開并溫習《圖解HTTP》一書,如果請求頻繁,最好建立持久連接,減少TCP連接的重復建立和斷開所造成的額外開銷,從而減輕服務端負載即重用HTTP連接,也稱為Http keep-alive,持久連接的特點是,只要任意一方沒有明確提出斷開連接,否則保持TCP連接狀態

配置keep-alive我們俗稱為保活機制,所以在默認請求頭中添加如下一行

  1. //增加保活機制,表明連接為長連接 
  2. client.DefaultRequestHeaders.Connection.Add("keep-alive"); 

上述只是在報文頭中添加持久化連接標識,但不意味著就一定生效,因為默認是禁用持久化連接,所以為了保險起見,添加如下代碼

  1. //啟用保活機制(保持活動超時設置為 2 小時,并將保持活動間隔設置為 1 秒。) 
  2. ServicePointManager.SetTcpKeepAlive(true, 7200000, 1000); 

有個讓我很疑惑的問題,通過查看設置啟用持久化連接源碼得知,這樣設置意義在哪里?沒弄明白,源碼如下

  1. public static void SetTcpKeepAlive(bool enabled, int keepAliveTime, int keepAliveInterval) 
  2.     if (enabled) 
  3.     { 
  4.         if (keepAliveTime <= 0) 
  5.         { 
  6.             throw new ArgumentOutOfRangeException(nameof(keepAliveTime)); 
  7.         } 
  8.         if (keepAliveInterval <= 0) 
  9.         { 
  10.             throw new ArgumentOutOfRangeException(nameof(keepAliveInterval)); 
  11.         } 
  12.     } 

最關鍵的一點則是默認持久化連接數為2,非持久化連接為4

  1. public class ServicePointManager 
  2.  { 
  3.      public const int DefaultNonPersistentConnectionLimit = 4; 
  4.      public const int DefaultPersistentConnectionLimit = 2; 
  5.  
  6.      private ServicePointManager() { } 
  7.  } 

那么問題是否就已很明了,項目中使用非持久化連接,即連接為4,未深究源碼具體細節,大膽猜想一下,若連接大于4,是否會出現將此前連接主動關閉,重建新的連接請求呢?

最終我們講原始代碼修改為如下形式

  1. static class Program 
  2.     static HttpClient httpClient = CreateHttpClient(); 
  3.  
  4.     static Program() 
  5.     { 
  6.         //默認連接數限制為2,增加連接數限制 
  7.         ServicePointManager.DefaultConnectionLimit = 512; 
  8.  
  9.         //啟用保活機制(保持活動超時設置為 2 小時,并將保持活動間隔設置為 1 秒。) 
  10.         ServicePointManager.SetTcpKeepAlive(true, 7200000, 1000); 
  11.     } 
  12.  
  13.     static async Task Main(string[] args) 
  14.     { 
  15.         await httpClient.PostAsync("", new StringContent("")); 
  16.  
  17.         Console.WriteLine("Hello World!"); 
  18.     } 
  19.  
  20.     static HttpClient CreateHttpClient() 
  21.     { 
  22.         var client = new HttpClient(new HttpClientHandler 
  23.         { 
  24.             ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true
  25.             SslProtocols = SslProtocols.Tls12 
  26.         }) 
  27.         { 
  28.             Timeout = TimeSpan.FromSeconds(30) 
  29.         }; 
  30.  
  31.         client.DefaultRequestHeaders.Accept.Clear(); 
  32.         //增加保活機制,表明連接為長連接 
  33.         client.DefaultRequestHeaders.Connection.Add("keep-alive"); 
  34.         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
  35.         client.DefaultRequestHeaders.Add("ContentType""application/json"); 
  36.         return client; 
  37.     } 

進行如上設置后,通過一天觀察,再未出現相關異常,至此問題解決告一段落,希望沒有后續......

強烈建議:利用HttpClient發送請求設置持久化連接和根據實際業務評估增加連接數,而非默認的持久化連接為2,非持久化連接為4,否則極易出現相關異常。

引發思考:利用HttpClientFactory創建HttpClient是否有默認連接限制,據我所知,好像可以通過屬性MaxConnectionsPerServer來配置

若非常清楚默認連接數限制,可能并算不上什么問題,也不存在如此諸多分析,不過對于我而言,收獲的是在問題排查過程中,對可能干擾信息的過濾、篩選、確認以及對網絡協議進一步的理解加深。

 

在.NET Core和.NET Framework中相關配置還是有些變化,最好是根據對應版本在官網上確認下

 

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2021-06-06 13:07:06

.NETWindowsLinux

2021-12-02 07:25:58

ASP.NET CorAjax請求

2021-05-11 15:50:28

ASP.NET單元測試

2024-09-10 08:13:16

Asp項目輕量級

2013-08-22 17:10:09

.Net異常處理

2024-09-24 17:34:05

2024-08-29 09:11:38

GolangEOF連接池

2024-11-25 16:29:23

2024-05-13 09:32:06

攔截器HTTP中間件

2025-01-15 00:01:00

開發應用界面

2016-12-06 10:23:24

.NETCore首例Office

2024-11-12 07:28:39

2019-08-07 14:25:21

.NET.NET Core 3編程語言

2021-12-05 18:22:20

.NETLS Cipher套件

2024-09-09 07:37:51

AspJWT權限

2024-06-11 09:00:00

異步編程代碼

2018-08-20 08:03:46

跨平臺 Web操作系統

2024-09-30 09:48:41

RabbitMQ消息中間件

2024-06-27 10:48:48

2011-04-13 14:57:11

ASP.NET請求處理
點贊
收藏

51CTO技術棧公眾號

在线综合视频网站| 亚洲欧美制服综合另类| 日韩视频一二三| 欧洲成人一区二区三区| 欧美亚洲免费| 色婷婷综合成人av| 韩国一区二区三区四区| 在线观看欧美日韩电影| 国产精品国产三级国产| 高清视频在线观看一区| 69av视频在线观看| 欧美久久一区| 一本色道久久综合狠狠躁篇的优点| 中文字幕一区二区在线观看视频 | 亚洲午夜未删减在线观看 | 天天爱天天做天天爽| 久久精品青草| 亚洲人高潮女人毛茸茸| 人妻体体内射精一区二区| 最近高清中文在线字幕在线观看1| 中文字幕精品综合| 韩国成人一区| 精品国产乱码一区二区三| 久久午夜影视| 久久久久国产精品免费网站| 91麻豆精品国产91久久综合| 露出调教综合另类| 欧美一区二区三区电影| 人人干人人干人人| 在线观看精品| 日韩欧美在线视频| 欧美高清中文字幕| 国产黄色小视频在线| 久久精品人人做人人爽人人| 国产一区二区精品免费| jizz中国少妇| 国产一区欧美一区| 国产三级精品网站| 无码人妻一区二区三区线 | 999精品网站| 国产后进白嫩翘臀在线观看视频| 亚洲手机成人高清视频| 亚洲国产高清国产精品| 国产视频网站在线| 2024国产精品视频| 久久久99爱| 亚洲欧美日韩免费| www.亚洲精品| 国产视频在线观看一区| 亚洲国产一二三区| 懂色av中文字幕一区二区三区| 成人在线小视频| 97在线公开视频| 精品一二线国产| 国产中文日韩欧美| 国产又粗又长又大视频| 久久66热偷产精品| 91青草视频久久| 99国产精品久久久久99打野战| 精品系列免费在线观看| 亚洲一区二区中文| 精品久久在线观看| 懂色av一区二区夜夜嗨| 国产精品免费一区二区三区观看| av一级黄色片| 成人三级伦理片| 精品亚洲一区二区三区四区五区高| 天堂在线资源网| 91一区二区三区在线观看| 久久手机视频| yjizz视频网站在线播放| 国产精品丝袜在线| 五月天色婷婷综合| 在线观看三级视频| 亚洲电影在线播放| 六月丁香婷婷激情| 精品视频在线一区二区在线| 欧美日韩精品一区二区天天拍小说 | 日韩免费毛片| 免费黄色在线观看| 一区二区三区在线观看国产| 国产日韩av网站| 97成人资源| 欧美日韩免费不卡视频一区二区三区| 中文字幕第100页| 日韩在线视频一区二区三区| 日韩av影视在线| 色综合99久久久无码国产精品| 不卡一区综合视频| 欧美激情久久久久| 中文字幕一区二区三区四区欧美| 青椒成人免费视频| 7777奇米亚洲综合久久| 四虎精品在永久在线观看| 国产精品欧美一区二区三区| 人妻无码一区二区三区四区| 国产高清不卡| 欧美一区二区免费| 黄色性生活一级片| 欧美电影免费播放| 久久久久久欧美| 免费黄色小视频在线观看| 国产麻豆视频一区| 欧美日韩国产免费一区二区三区 | 日韩av电影手机在线| 国产精品久久久久久久免费| 99精品视频一区二区三区| 影音先锋欧美在线| 美女露胸视频在线观看| 欧美高清视频一二三区| 草草影院第一页| 中文字幕一区二区三三| 国产国产精品人在线视| 亚洲欧美另类综合| 国产精品素人视频| 免费在线激情视频| 777久久精品| 日韩中文字在线| 在线天堂中文字幕| 高清在线不卡av| 亚洲一二三区精品| 国产精品迅雷| 亚洲国产精品成人av| 中文字幕电影av| 日本aⅴ亚洲精品中文乱码| 国产伦精品一区二区三区高清版| 免费黄色网页在线观看| 日本高清无吗v一区| 在线免费播放av| 欧美视频在线观看| 91沈先生在线观看| 色大18成网站www在线观看| 欧美性极品xxxx做受| 日韩综合第一页| 欧美成人午夜| 亚洲一区二区三区四区视频| 日本在线视频网| 91福利在线播放| 91精品人妻一区二区| 国产日韩欧美一区| 国产日韩精品推荐| 男人天堂亚洲| 欧美不卡一区二区三区四区| 国产97免费视频| 国产一区二区三区在线看麻豆| 亚洲人一区二区| 久久99国产精品二区高清软件| 亚洲日韩第一页| 欧美一区免费看| 久久久久免费观看| 密臀av一区二区三区| 精品久久电影| 国产精品入口尤物| 天堂地址在线www| 欧美精品乱人伦久久久久久| 91麻豆精品成人一区二区| 久久国产人妖系列| 中文精品一区二区三区 | 欧美猛男超大videosgay| 日本在线观看网址| 精品一区二区综合| 在线观看三级网站| 999国产精品一区| 97精品国产97久久久久久| 亚洲欧洲综合在线| 一本一道久久a久久精品| 欧美特级黄色录像| 久久国产尿小便嘘嘘| 日韩最新中文字幕| 91麻豆精品激情在线观看最新 | 欧美视频在线播放一区| 亚洲调教一区| 国产综合久久久久久| 最爽无遮挡行房视频在线| 欧美成人福利视频| 国产99久久久| 国产精品萝li| 黄色激情在线观看| 日本女人一区二区三区| 影音先锋成人资源网站| 高潮久久久久久久久久久久久久 | 99精品欧美一区二区蜜桃免费| 激情综合网婷婷| 国产精品x453.com| 国产在线精品日韩| 国产精品原创视频| 久久久久久久久久av| 国产精品一区二区婷婷| 91麻豆精品国产91久久久久久 | 丁香激情五月少妇| 国产精品一区二区你懂的| 蜜桃传媒一区二区三区| 欧美日韩激情| 国产精品一区二区a| 成人日韩在线| 欧美精品18videos性欧美| 免费人成在线观看网站| 这里只有精品免费| 依依成人综合网| 亚洲人成在线观看一区二区| 日韩 中文字幕| 激情综合一区二区三区| 日韩少妇内射免费播放| 久久久五月天| 日韩和欧美的一区二区| 精品国产一区二区三区成人影院| 国产精品女人久久久久久| segui88久久综合| 精品久久久91| 免费一级在线观看| 亚洲成人免费在线视频| 国产女人高潮毛片| 91极品美女在线| 国产福利拍拍拍| 亚洲精品欧美在线| 青青青视频在线播放| 久久综合九色综合97婷婷女人| 精品国产午夜福利在线观看| 日韩成人免费看| 欧美日韩在线一| 国产精品a级| 天天做天天爱天天高潮| 精品美女久久| 人偷久久久久久久偷女厕| 亚洲精品黑牛一区二区三区| 国产啪精品视频| 99久久婷婷国产综合精品首页| 久久久久久国产| 亚洲精品天堂| 久久精品亚洲94久久精品| av一本在线| 亚洲一级黄色av| 天堂在线一二区| 亚洲精品狠狠操| 天堂在线资源8| 亚洲精品97久久| 国产成人无码www免费视频播放| 欧美猛男男办公室激情| 亚洲一卡二卡在线观看| 欧美日韩视频一区二区| 国产成人麻豆免费观看| 色8久久人人97超碰香蕉987| 免费黄色网址在线| 欧美日韩一区二区在线| 91视频免费网址| 欧美视频精品一区| 亚洲欧美自拍视频| 色香色香欲天天天影视综合网| 九一国产在线观看| 欧美性xxxxhd| 亚洲乱码国产乱码精品| 日本道精品一区二区三区| 欧美一级淫片免费视频黄| 91国偷自产一区二区开放时间| 一级黄色在线视频| 在线精品亚洲一区二区不卡| 中文字幕+乱码+中文乱码www| 奇米影视首页 狠狠色丁香婷婷久久综合 | 24小时免费看片在线观看 | 美女100%一区| 国产精品吹潮在线观看| 黄色欧美视频| 亚洲r级在线观看| 2020最新国产精品| 久久精品国产精品青草色艺| 欧美男男gaytwinkfreevideos| 日韩av在线电影观看| 99久久99视频只有精品| 国产高潮呻吟久久久| 欧美99久久| 老太脱裤子让老头玩xxxxx| 久久亚洲综合| 亚洲免费黄色录像| 粉嫩绯色av一区二区在线观看| 插我舔内射18免费视频| 美足av综合网| 久久国产精品成人免费观看的软件| 国产一区二区三区免费看| 在线看国产一区| 午夜剧场免费在线观看| 亚洲精品videosex极品| 国产午夜精品无码| 亚洲图片在线| 亚洲国产天堂网精品网站| 亚洲精品视频专区| 亚洲欧美在线一区二区| 欧美一区二区三区| 97视频在线播放| 国产日本久久| 国产乱子伦精品| 欧美gvvideo网站| 日韩欧美不卡在线| 日韩中文字幕91| 欧美xxxx日本和非洲| 337p粉嫩大胆噜噜噜噜噜91av | 久久九九国产精品怡红院| 在线免费观看污| 国产成人精品免费久久久久| 欧美视频二区欧美影视| 欧美一区国产一区| 中文字幕一区二区三区欧美日韩 | 中文在线最新版地址| 91久久国产精品| 国产精品一区二区av交换| 丰满人妻一区二区三区53号| 日一区二区三区| 扒开伸进免费视频| 中文字幕一区二区三区视频| 91av在线免费视频| 91精品国产综合久久久久久 | 久久综合五月婷婷| 亚洲精品中文综合第一页| 欧美午夜在线视频| 五月天视频在线观看| 久久久99精品久久| 日本在线观看视频网站| 欧美一区二区三区在线| 国产视频在线看| 久久免费国产视频| 激情视频亚洲| 亚洲精品自在在线观看| 丝袜亚洲另类欧美综合| 色综合久久五月| 亚洲午夜在线视频| 国产肥老妇视频| 日韩综合中文字幕| 91久久久久久白丝白浆欲热蜜臀| 精品国产乱码久久久久久108| 五月天综合网站| av污在线观看| 久久久久久亚洲综合影院红桃| 国产乡下妇女做爰毛片| 日韩欧美卡一卡二| 麻豆视频在线免费观看| 国产欧美一区二区三区久久| 狠狠做六月爱婷婷综合aⅴ| 日韩免费一级视频| a级高清视频欧美日韩| 久久久久久久9999| 日韩欧美一区二区三区在线| 岛国中文字幕在线| 成人亚洲欧美一区二区三区| 91青青国产在线观看精品| 日本免费观看网站| 国产精品欧美一区喷水| 中文字幕日日夜夜| xvideos成人免费中文版| 成人精品高清在线视频| 夜夜爽www精品| 精品一区二区三区在线播放| 成人欧美一区二区三区黑人一| 欧美在线啊v一区| av成人手机在线| 成人乱色短篇合集| 一区二区在线| 少妇熟女视频一区二区三区| 亚洲成人av一区二区| 天堂中文在线看| 日韩免费黄色av| 日韩精品91| 在线看免费毛片| 伊人夜夜躁av伊人久久| 丰满人妻妇伦又伦精品国产| 97香蕉久久超级碰碰高清版| 免费欧美激情| 精品久久久99| 又紧又大又爽精品一区二区| 亚洲精品字幕在线观看| 777精品视频| 精品久久久中文字幕| 不卡中文字幕在线观看| 亚洲精品videosex极品| 天天色综合久久| 国产精品电影网站| 91精品久久久久久久久久不卡| 苍井空张开腿实干12次| 狠狠色狠色综合曰曰| 国产视频三级在线观看播放| 91在线观看欧美日韩| 亚洲精品黄色| jizz18女人高潮| 日韩视频一区二区| 亚洲国产福利| www.-级毛片线天内射视视| 成人高清av在线| 中文天堂在线视频| 欧美国产亚洲视频| 国产日产精品一区二区三区四区的观看方式| 美女在线视频一区二区| 亚洲高清在线精品| 成年网站在线| 国产精品日韩一区二区 | 国产精品亚洲第一区| 黑丝一区二区| 精品伦精品一区二区三区视频密桃 | 欧美精品一二区| 激情婷婷综合| 扒开伸进免费视频| 9191国产精品| 欧美日韩美女|