C#使用HttpClient進(jìn)行Post請(qǐng)求出現(xiàn)超時(shí)問題的解決及優(yōu)化
優(yōu)化結(jié)論
我直接上優(yōu)化結(jié)論吧,就不放上老的代碼了。需要從以下幾個(gè)點(diǎn)來優(yōu)化。
單例HttpClient
問題:如果 HttpClient 實(shí)例頻繁創(chuàng)建和銷毀,可能導(dǎo)致連接池中的資源被占滿,新的請(qǐng)求需要等待釋放資源,從而造成長時(shí)間的延遲。
首先單例HttpClient,每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的 HttpClient 實(shí)例。HttpClient 的短生命周期會(huì)導(dǎo)致以下問題:
1,頻繁建立和銷毀連接,無法復(fù)用已有的連接池。
2,增加連接開銷,可能導(dǎo)致長時(shí)間等待(尤其在并發(fā)請(qǐng)求時(shí))。
所以我們直接
private static readonly HttpClient client = new HttpClient { Timeout = TimeSpan.FromSeconds(15) // 設(shè)置超時(shí)時(shí)間 };
連接池耗盡和并發(fā)
合理設(shè)置 ServicePointManager.DefaultConnectionLimit,因?yàn)榫退闶菃卫腍ttpClient也會(huì)有連接數(shù)的限制。我們看看這個(gè)參數(shù)說明:
// 摘要: // Gets or sets the maximum number of concurrent connections allowed by a System.Net.ServicePoint // object. // // 返回結(jié)果: // The maximum number of concurrent connections allowed by a System.Net.ServicePoint // object. The default connection limit is 10 for ASP.NET hosted applications and // 2 for all others. When an app is running as an ASP.NET host, it is not possible // to alter the value of this property through the config file if the autoConfig // property is set to true. However, you can change the value programmatically when // the autoConfig property is true. Set your preferred value once, when the AppDomain // loads. // // 異常: // T:System.ArgumentOutOfRangeException: // System.Net.ServicePointManager.DefaultConnectionLimit is less than or equal to // 0.
有一句是重點(diǎn)
ASP的默認(rèn)連接限制是10。. NET托管應(yīng)用程序和其他的都是2。
我可能有時(shí)又3-4個(gè)并發(fā),可能問題在這里,那么我直接設(shè)置100個(gè)就足夠滿足我的程序了。
ServicePointManager.DefaultConnectionLimit = 100; // 調(diào)高默認(rèn)連接限制
并發(fā)異步
如果你的程序有很高的并發(fā),可能會(huì)耗盡你的CPU,那么需要使用異步。
HttpResponseMessage response = await client.PostAsync(url, content);
最終優(yōu)化后
我最終的代碼狀態(tài)如下:
public async Task<string> PostFormResult(string url, string parm) { Log("PostFormResult 開始請(qǐng)求: " + url + ", parm: " + parm); try { byte[] buf = Encoding.UTF8.GetBytes(parm); using (HttpContent content = new ByteArrayContent(buf)) { //這里我是表單,可以換成json content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded"); //content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); //添加Token //client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); HttpResponseMessage res = await client.PostAsync(url, content); if (res.IsSuccessStatusCode) { string json = await res.Content.ReadAsStringAsync(); Log("PostFormResult請(qǐng)求成功: " + json); return json; } else { Warning("PostFormResult請(qǐng)求失敗: " + res.StatusCode); } } } catch (HttpRequestException ex) { Warning("請(qǐng)求Post出現(xiàn)錯(cuò)誤: " + ex.Message); } catch (Exception ex) { Warning($"請(qǐng)求Post出現(xiàn)錯(cuò)誤: {ex.Message}"); } return string.Empty; }
我的請(qǐng)求會(huì)同時(shí)出現(xiàn)了4個(gè)。所以超過了并發(fā)所以產(chǎn)生了問題,修改后就沒有問題了。
到此這篇關(guān)于C#使用HttpClient進(jìn)行Post請(qǐng)求總是出現(xiàn)超時(shí)問題的解決及優(yōu)化的文章就介紹到這了,更多相關(guān)C# HttpClient進(jìn)行Post請(qǐng)求出現(xiàn)超時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談C#下winform和JS的互相調(diào)用和傳參(webbrowser)
下面小編就為大家?guī)硪黄獪\談C#下winform和JS的互相調(diào)用和傳參(webbrowser)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle
這篇文章主要介紹了C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02C#使用MD5算法對(duì)密碼進(jìn)行加密的示例代碼
MD5(Message Digest Algorithm 5)是一種被廣泛使用的“消息-摘要算法”,“消息-摘要算法”實(shí)際上就是一個(gè)單項(xiàng)散列函數(shù),數(shù)據(jù)塊經(jīng)過單向散列函數(shù)得到一個(gè)固定長度的散列值,本文給大家介紹了C#使用MD5算法對(duì)密碼進(jìn)行加密,需要的朋友可以參考下2024-03-03C#?wpf利用附加屬性實(shí)現(xiàn)界面上定義裝飾器
裝飾器是wpf中可以浮在控件上面的一種組件,我們通??梢杂脕韺?shí)現(xiàn)一些諸如控件拖動(dòng)點(diǎn)、提示框、自定義鼠標(biāo)等界面功能。本文主要是利用附加屬性實(shí)現(xiàn)界面上定義裝飾器,需要的可以參考下2022-12-12C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C#實(shí)現(xiàn)系統(tǒng)信息監(jiān)控與獲取功能
在 C# 開發(fā)的眾多應(yīng)用場(chǎng)景中,獲取系統(tǒng)信息以及監(jiān)控用戶操作有著廣泛的用途,比如在系統(tǒng)性能優(yōu)化工具中,需要實(shí)時(shí)讀取 CPU、GPU 資源信息,本文將詳細(xì)介紹如何使用 C# 來實(shí)現(xiàn)這些功能,助力大家在開發(fā)中更好地與系統(tǒng)底層進(jìn)行交互,需要的朋友可以參考下2025-01-01