最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解.NET 開發(fā)中 HttpClient 的坑與最佳實(shí)踐

 更新時間:2026年01月05日 10:42:13   作者:寒冰屋  
本文主要介紹了.NET 開發(fā)中 HttpClient 的坑與最佳實(shí)踐,包括復(fù)用HttpClient、請求級別設(shè)置Header、釋放HttpResponseMessage、設(shè)置超時、解決DNS緩存問題、采用流式處理大文件請求等,感興趣的可以了解一下

在 .NET 項(xiàng)目開發(fā)中,HttpClient 幾乎是調(diào)用外部 API 的必備工具。它使用簡單,但如果不了解其內(nèi)部機(jī)制,往往會踩坑,甚至導(dǎo)致 服務(wù)雪崩、端口耗盡 等嚴(yán)重問題。

今天我們就來盤點(diǎn)一下 HttpClient 中常見的坑,以及對應(yīng)的最佳實(shí)踐。

1.using導(dǎo)致端口耗盡

很多開發(fā)者習(xí)慣這樣寫:

using?(var?client =?new?HttpClient())
{
? ??var?response =?await?client.GetAsync(url);
}

表面上這是標(biāo)準(zhǔn)的 C# 資源釋放模式,但 HttpClient 內(nèi)部維護(hù)了 連接池。頻繁創(chuàng)建和釋放,會導(dǎo)致 端口耗盡(Socket Exhaustion),最終請求失敗。

最佳實(shí)踐:HttpClient 應(yīng)該 復(fù)用。
在 ASP.NET Core 中推薦使用 IHttpClientFactory 來統(tǒng)一管理生命周期:

builder.Services.AddHttpClient("MyClient", client =>
{
? ? client.BaseAddress =?new?Uri("https://api.example.com");
});

2. 全局 Header 污染

如果你這樣設(shè)置 Header:

httpClient.DefaultRequestHeaders.Add("Authorization",?"Bearer xxx");

注意!所有后續(xù)請求都會帶上這個 Header。在多用戶、多服務(wù)場景下可能導(dǎo)致嚴(yán)重問題。

最佳實(shí)踐:推薦在 請求級別 設(shè)置 Header。

var?request =?new?HttpRequestMessage(HttpMethod.Get,?"/data");
request.Headers.Authorization =?new?AuthenticationHeaderValue("Bearer", token);

3. 忘記釋放HttpResponseMessage

很多時候我們寫:

var?response =?await?httpClient.GetAsync("/data");
var?content =?await?response.Content.ReadAsStringAsync();

如果沒有手動 Dispose,連接會長時間占用。

最佳實(shí)踐:使用 using 語法確保釋放。

using?var?response =?await?httpClient.GetAsync("/data");
response.EnsureSuccessStatusCode();
var?content =?await?response.Content.ReadAsStringAsync();

4. 超時沒設(shè)置

HttpClient 默認(rèn)超時時間是 100 秒。在高并發(fā)環(huán)境下,如果目標(biāo)服務(wù)響應(yīng)緩慢,可能會導(dǎo)致請求堆積。

最佳實(shí)踐:設(shè)置合理的超時時間。

httpClient.Timeout = TimeSpan.FromSeconds(10);

或者使用 CancellationToken 精確控制:

using?var?cts =?new?CancellationTokenSource(TimeSpan.FromSeconds(5));
await?httpClient.GetAsync("/data", cts.Token);

5. DNS 緩存問題

在早期 .NET Framework 中,HttpClient 單例會導(dǎo)致 DNS 緩存永不過期。域名變更后,服務(wù)依然請求舊的 IP。

在 .NET Core 已經(jīng)優(yōu)化了這一點(diǎn),但如果是老項(xiàng)目,可以手動指定連接生命周期:

builder.Services.AddHttpClient("MyClient")
? ? .ConfigurePrimaryHttpMessageHandler(() =>
? ? ? ??new?SocketsHttpHandler
? ? ? ? {
? ? ? ? ? ? PooledConnectionLifetime = TimeSpan.FromMinutes(2)
? ? ? ? });

6. 大文件請求導(dǎo)致內(nèi)存爆炸

很多人習(xí)慣使用 ReadAsStringAsync(),但如果返回的是大文件(如日志、視頻),會直接把內(nèi)存撐爆。

最佳實(shí)踐:采用 流式處理。

using?var?response =?await?httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
await?using?var?stream =?await?response.Content.ReadAsStreamAsync();
// 手動處理流

7. 缺少重試機(jī)制

網(wǎng)絡(luò)調(diào)用難免失敗,如果沒有重試機(jī)制,服務(wù)穩(wěn)定性會大打折扣。

最佳實(shí)踐:結(jié)合 Polly 添加重試策略。

builder.Services.AddHttpClient("MyClient")
? ? .AddPolicyHandler(Policy
? ? ? ? .Handle<HttpRequestException>()
? ? ? ? .OrResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
? ? ? ? .WaitAndRetryAsync(3, retry => TimeSpan.FromSeconds(retry)));

 

到此這篇關(guān)于詳解.NET 開發(fā)中 HttpClient 的坑與最佳實(shí)踐的文章就介紹到這了,更多相關(guān).NET HttpClient的坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

漠河县| 凤山市| 简阳市| 延庆县| 莆田市| 平利县| 景泰县| 曲阜市| 漳浦县| 菏泽市| 山阴县| 舞钢市| 耒阳市| 南丹县| 靖江市| 基隆市| 页游| 遵义县| 军事| 彰武县| 登封市| 托里县| 康马县| 吉林省| 桂阳县| 郧西县| 合水县| 高要市| 棋牌| 台山市| 莎车县| 遂溪县| 藁城市| 金川县| 陵水| 永川市| 宝应县| 怀化市| 仁化县| 铁岭市| 南皮县|