C#使用HttpClient進行Post請求出現(xiàn)超時問題的解決及優(yōu)化
優(yōu)化結(jié)論
我直接上優(yōu)化結(jié)論吧,就不放上老的代碼了。需要從以下幾個點來優(yōu)化。
單例HttpClient
問題:如果 HttpClient 實例頻繁創(chuàng)建和銷毀,可能導(dǎo)致連接池中的資源被占滿,新的請求需要等待釋放資源,從而造成長時間的延遲。
首先單例HttpClient,每次請求都會創(chuàng)建一個新的 HttpClient 實例。HttpClient 的短生命周期會導(dǎo)致以下問題:
1,頻繁建立和銷毀連接,無法復(fù)用已有的連接池。
2,增加連接開銷,可能導(dǎo)致長時間等待(尤其在并發(fā)請求時)。
所以我們直接
private static readonly HttpClient client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(15) // 設(shè)置超時時間
};
連接池耗盡和并發(fā)
合理設(shè)置 ServicePointManager.DefaultConnectionLimit,因為就算是單例的HttpClient也會有連接數(shù)的限制。我們看看這個參數(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.
有一句是重點
ASP的默認連接限制是10。. NET托管應(yīng)用程序和其他的都是2。
我可能有時又3-4個并發(fā),可能問題在這里,那么我直接設(shè)置100個就足夠滿足我的程序了。
ServicePointManager.DefaultConnectionLimit = 100; // 調(diào)高默認連接限制
并發(fā)異步
如果你的程序有很高的并發(fā),可能會耗盡你的CPU,那么需要使用異步。
HttpResponseMessage response = await client.PostAsync(url, content);
最終優(yōu)化后
我最終的代碼狀態(tài)如下:
public async Task<string> PostFormResult(string url, string parm)
{
Log("PostFormResult 開始請求: " + 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請求成功: " + json);
return json;
}
else
{
Warning("PostFormResult請求失敗: " + res.StatusCode);
}
}
}
catch (HttpRequestException ex)
{
Warning("請求Post出現(xiàn)錯誤: " + ex.Message);
}
catch (Exception ex)
{
Warning($"請求Post出現(xiàn)錯誤: {ex.Message}");
}
return string.Empty;
}
我的請求會同時出現(xiàn)了4個。所以超過了并發(fā)所以產(chǎn)生了問題,修改后就沒有問題了。
到此這篇關(guān)于C#使用HttpClient進行Post請求總是出現(xiàn)超時問題的解決及優(yōu)化的文章就介紹到這了,更多相關(guān)C# HttpClient進行Post請求出現(xiàn)超時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談C#下winform和JS的互相調(diào)用和傳參(webbrowser)
下面小編就為大家?guī)硪黄獪\談C#下winform和JS的互相調(diào)用和傳參(webbrowser)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C# 使用 Castle 實現(xiàn) AOP及如何用 Autofac 集成 Castle
這篇文章主要介紹了C# 使用 Castle 實現(xiàn) AOP及如何用 Autofac 集成 Castle,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02
C#面向?qū)ο笤O(shè)計原則之組合/聚合復(fù)用原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計原則之組合/聚合復(fù)用原則,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
C#實現(xiàn)系統(tǒng)信息監(jiān)控與獲取功能
在 C# 開發(fā)的眾多應(yīng)用場景中,獲取系統(tǒng)信息以及監(jiān)控用戶操作有著廣泛的用途,比如在系統(tǒng)性能優(yōu)化工具中,需要實時讀取 CPU、GPU 資源信息,本文將詳細介紹如何使用 C# 來實現(xiàn)這些功能,助力大家在開發(fā)中更好地與系統(tǒng)底層進行交互,需要的朋友可以參考下2025-01-01

