最新国产好看的视频,伊人天堂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)文章

最新評論

西昌市| 汕尾市| 新竹市| 阜城县| 密云县| 涡阳县| 溆浦县| 宣恩县| 南充市| 遂宁市| 尼玛县| 湖南省| 黄梅县| 类乌齐县| 天长市| 湘潭县| 黄山市| 吉林市| 囊谦县| 沙湾县| 濮阳市| 繁峙县| 琼结县| 华安县| 尚义县| 云浮市| 恩平市| 巍山| 扎赉特旗| 莎车县| 稻城县| 虹口区| 图木舒克市| 冷水江市| 富裕县| 海南省| 辽中县| 峨眉山市| 清徐县| 永新县| 时尚|