C#.NET HttpClient 使用教程

簡介

HttpClient.NET 中用于發送 HTTP 請求和接收 HTTP 響應的現代化 API,它取代了過時的 WebClientHttpWebRequest 類。

HttpClient.NET Framework 4.5 + 和 .NET Core/.NET 5+ 中提供的、基于消息處理管道(message handler pipeline)的現代 HTTP 客戶端庫。

相比早期的 HttpWebRequest,它更易用、支持異步、可擴展性強,并且在 .NET Core 中底層使用 SocketsHttpHandler,性能與可配置性都有顯著提升。

底層架構

  • HttpClient

    • 封裝請求創建、發送及響應處理邏輯,提供 GetAsync、PostAsync、SendAsync 等方法。
  • HttpMessageHandler 管道

    • 默認使用 SocketsHttpHandler(.NET Core/.NET 5+).NET Framework 下為 HttpClientHandler

    • 可以通過繼承 DelegatingHandler 串聯多個自定義中間件(例如日志、重試、認證)。

  • 連接池與長連接

    • SocketsHttpHandler 內置連接池和 HTTP/2 支持,同一目標主機復用 TCP 連接,減少握手與重建成本。

HttpClient 核心特性

特性說明優勢
異步支持所有方法都有異步版本避免阻塞線程,提高并發能力
連接池自動管理 HTTP 連接減少 TCP 連接開銷
超時控制可配置請求超時時間防止長時間阻塞
內容處理內置多種內容處理器簡化 JSON/XML 處理
取消支持支持 CancellationToken優雅終止長時間請求
擴展性可通過 DelegatingHandler 擴展實現日志、重試等中間件

常用方法

使用單例
public static class HttpClientSingleton
{public static readonly HttpClient Instance = new HttpClient();
}// 使用
await HttpClientSingleton.Instance.GetAsync(url);
  • 全局唯一,避免重復創建 handler,復用連接池。

  • 需注意:設置到期(Timeout)、默認頭(DefaultRequestHeaders)等全局屬性變更會影響所有調用。

使用 HttpClientFactory 工廠
services.AddHttpClient("GitHub", client =>
{client.BaseAddress = new Uri("https://api.github.com/");client.DefaultRequestHeaders.Add("User-Agent", "MyApp");
})
.AddTransientHttpErrorPolicy(policy =>policy.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));// 使用
var client = _httpClientFactory.CreateClient("GitHub");
  • 框架管理生命周期、穩定重用 SocketsHttpHandler

  • 支持命名客戶端、類型化客戶端、配置管道、添加 Polly 彈性策略。

類型化客戶端
public class GitHubService {private readonly HttpClient _client;public GitHubService(HttpClient client) => _client = client;// 封裝API方法
}
// 注冊
services.AddHttpClient<GitHubService>(client => { /* 配置 */ });
GET 請求
var client = HttpClientSingleton.Instance;
var response = await client.GetAsync("https://api.example.com/items/1");
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
POST 請求
var content = new StringContent(JsonSerializer.Serialize(new { Name = "測試" }),Encoding.UTF8, "application/json");
var postResp = await client.PostAsync("https://api.example.com/items", content);
postResp.EnsureSuccessStatusCode();
SendAsync 自定義請求
var request = new HttpRequestMessage(HttpMethod.Put, $"items/{id}")
{Content = new StringContent(json, Encoding.UTF8, "application/json")
};
request.Headers.Add("X-Custom", "Value");using var resp = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
resp.EnsureSuccessStatusCode();
流式上傳/下載
// 下載
using var resp = await client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead);
using var stream = await resp.Content.ReadAsStreamAsync();
// 將 stream 寫入文件 ...// 上傳
using var fs = File.OpenRead(localFilePath);
var streamContent = new StreamContent(fs);
var uploadResp = await client.PostAsync(uploadUrl, streamContent);
DelegatingHandler 管道
public class LoggingHandler : DelegatingHandler
{protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken ct){Console.WriteLine($"Request: {request}");var resp = await base.SendAsync(request, ct);Console.WriteLine($"Response: {resp}");return resp;}
}// 注冊(HttpClientFactory)
services.AddHttpClient("WithLogging").AddHttpMessageHandler<LoggingHandler>();
Polly 彈性策略
services.AddHttpClient("GitHub").AddTransientHttpErrorPolicy(p =>p.WaitAndRetryAsync(3, retry => TimeSpan.FromSeconds(1)));
  • AddTransientHttpErrorPolicy 捕獲 5xx、408、HttpRequestExceptiontransient 錯誤;

  • 可組合斷路器、超時、隔離策略。

認證與配置
  • Bearer Token
client.DefaultRequestHeaders.Authorization =new AuthenticationHeaderValue("Bearer", accessToken);
  • Client Certificates
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(new X509Certificate2("cert.pfx", "pwd"));
var client = new HttpClient(handler);
  • 代理
handler.Proxy = new WebProxy("http://127.0.0.1:8888");
handler.UseProxy = true;
設置超時和請求頭
httpClient.Timeout = TimeSpan.FromSeconds(30); // 設置全局超時
httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your-token");
處理不同類型的響應
// 獲取 JSON 響應
var jsonResponse = await httpClient.GetStringAsync("https://api.example.com/json");// 獲取二進制響應(如文件下載)
var bytes = await httpClient.GetByteArrayAsync("https://example.com/file.pdf");// 獲取流響應(大文件下載,避免內存溢出)
await using var stream = await httpClient.GetStreamAsync("https://example.com/largefile.zip");await using var fileStream = File.Create("largefile.zip");
await stream.CopyToAsync(fileStream);
發送帶參數的請求
// GET 請求帶查詢參數
var queryParams = new Dictionary<string, string>
{{ "page", "1" },{ "size", "20" }
};
var uri = new UriBuilder("https://api.example.com/data")
{Query = new FormUrlEncodedContent(queryParams).ReadAsStringAsync().Result
};
var response = await httpClient.GetAsync(uri.Uri);// POST 請求帶表單數據
var formContent = new FormUrlEncodedContent(new[]
{new KeyValuePair<string, string>("username", "test"),new KeyValuePair<string, string>("password", "pass")
});
await httpClient.PostAsync("https://example.com/login", formContent);
處理 HTTP 錯誤
try
{var response = await httpClient.GetAsync("https://api.example.com/resource");response.EnsureSuccessStatusCode(); // 非 200 狀態碼會拋出異常
}
catch (HttpRequestException ex)
{Console.WriteLine($"HTTP Error: {ex.StatusCode}");Console.WriteLine($"Message: {ex.Message}");
}
處理 gzip/deflate 壓縮響應
var httpClientHandler = new HttpClientHandler
{AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var httpClient = new HttpClient(httpClientHandler);
取消操作
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); // 10秒超時
try {var response = await client.GetAsync("https://slow-api.com", cts.Token);
} catch (TaskCanceledException) {// 處理超時
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88702.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88702.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88702.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx常用安全配置指南

Nginx是一個輕量級的&#xff0c;高性能的Web服務器以及反向代理和郵箱代理服務器。它運行在UNIX、GNU、linux、BSD、Mac OS X、Solaris和Windows各種版本。根據調查統計數據顯示&#xff0c;當前全球超過6%的網站使用Nginx Web服務器來管理Web網站應用。 為了保證基于Nginx的…

【UniApp 日期選擇器實現與樣式優化實踐】

UniApp 日期選擇器實現與樣式優化實踐 發布時間&#xff1a;2025/6/26 前言 在移動端應用開發中&#xff0c;日期選擇器是一個常見且重要的交互組件。本文將分享我們在 UniApp 項目中實現自定義日期選擇器的經驗&#xff0c;特別是在樣式優化過程中遇到的問題及解決方案。通過…

推薦系統的視頻特征-視頻關鍵幀特征提取與向量生成

&#x1f4cc; 總體流程概覽 視頻文件 (.mp4)↓ 關鍵幀抽取&#xff08;FFmpeg / SceneDetect&#xff09;↓ 幀圖像&#xff08;.jpg&#xff09;↓ 圖像模型提取特征&#xff08;CLIP / CNN / ViT&#xff09;↓ 多幀聚合成視頻向量&#xff08;均值池化等&#xff09;↓ 向…

Apache SeaTunnel Flink引擎執行流程源碼分析

目錄 1. 任務啟動入口 2. 任務執行命令類:FlinkTaskExecuteCommand 3. FlinkExecution的創建與初始化 3.1 核心組件初始化 3.2 關鍵對象說明 4. 任務執行:FlinkExecution.execute() 5. Source處理流程 5.1 插件初始化 5.2 數據流生成 6. Transform處理流程 6.1 插…

Vue 3 + Element Plus 實現「動態表單組件」詳解教程

? Vue 3 Element Plus 實現「動態表單組件」詳解教程 &#x1f4cc; 適用場景&#xff1a;表單字段根據配置動態生成&#xff0c;支持校驗、提交、自定義組件、復雜布局等。 &#x1f9e9; 技術棧&#xff1a;Vue 3 TypeScript Element Plus &#x1f527; 核心特性&#x…

本地部署開源時間跟蹤工具 Kimai 并實現外部訪問( Windows 版本)

Kimai 是一款開源的時間跟蹤工具&#xff0c;它易于使用&#xff0c;并提供了強大的報告功能&#xff0c;在個人和團隊記錄工作時間、項目時間和活動時間等之后可以幫助用戶了解他們是如何花費時間的&#xff0c;從而提高生產力和效率。本文將詳細介紹如何在 Windows 系統本地部…

系統分析師案例知識點

目錄 1 必做題1.1 狀態機圖1.2 活動圖1.3 統一軟件開發過程RUP 2 需求分析2.1 數據流圖DFD2.2 ER圖2.3 狀態轉換圖STD2.4 數據字典2.5 流程圖2.6 需求評審2.7 設計類2.8 FAST分析2.9 常見的關系類 3 嵌入式3.1 容器技術3.2 虛擬機技術3.3 虛擬機和容器的不同點 4 數據庫4.1 NoS…

多相機人臉掃描設備如何助力高效打造數字教育孿生體?

在教育數字化轉型浪潮中&#xff0c;數字孿生體作為現實教育場景的虛擬映射&#xff0c;正成為智慧教育發展的關鍵技術支點。傳統教育模式面臨師資資源分布不均、個性化教學難以覆蓋、跨時空教學場景受限等痛點&#xff0c;而數字孿生體通過構建高仿真虛擬教育主體&#xff08;…

用 EXCEL/WPS 實現聚類分析:賦能智能客服場景的最佳實踐

聚類分析作為無監督學習的核心技術&#xff0c;能在客服數據中發現隱藏的用戶群體或問題模式。盡管 Excel/WPS 并非專業統計軟件&#xff0c;但巧妙利用其內置功能&#xff0c;也能實現基礎的聚類分析&#xff0c;為中小型客服團隊提供快速洞察。以下介紹具體方法及智能客服場景…

基于定制開發開源AI智能名片S2B2C商城小程序源碼的H5游戲開發模式創新研究

摘要 本文以定制開發開源AI智能名片S2B2C商城小程序源碼為技術底座&#xff0c;探討其在H5游戲開發中的創新應用。通過分析原生開發與第三方工具兩種傳統開發模式的局限性&#xff0c;提出將AI智能名片的多模態內容生成能力、S2B2C商城的生態協同機制與H5游戲開發深度融合的解…

vue3+ELInput無法輸入的問題

vue3ElInput無法輸入的問題 開篇 寫業務的時候發現&#xff0c;因為想偷懶嘛&#xff0c;直接就在想在外部去定義一個變量&#xff0c;然后寫個彈窗里&#xff08;tsx&#xff09;的el-input&#xff0c;而不是又去寫個vue頁面&#xff0c;但發現就輸入不了了&#xff0c;而且…

SQL Server:如何檢測和修復 FILESTREAM 數據庫損壞?

SQL Server 中的 FILESTREAM 功能可以將二進制大型對象 &#xff08;BLOB&#xff09; 存儲到文件系統上&#xff0c;而不是將它們存儲在數據庫中。但是&#xff0c;默認情況下不啟用此功能。用戶需要使用 SQL Server Management Studio &#xff08;SSMS&#xff09; 和 SQL S…

FORCE 開發者論壇 | 火山引擎發布多款 Agent 開發工具

資料來源&#xff1a;火山引擎-開發者社區 6 月 12 日&#xff0c;2025 火山引擎 FORCE 原動力大會開發者論壇成功舉辦。大會聚焦 Agent 開發新范式&#xff0c;升級發布了 PromptPilot、MCP Servers、TRAE、扣子開發平臺等產品&#xff0c;以及多款開源項目&#xff0c;構建起…

【Qt-windows】如何使用perfmon 具體分析windows serverR2的Qt程序CPU問題

可以使用 Windows 自帶的 PerfMon&#xff08;Performance Monitor&#xff09; 工具對運行在 Windows Server R2 上的 Qt 程序進行詳細的性能分析&#xff0c;尤其是 CPU 使用情況。以下是具體的操作步驟和建議&#xff1a; 一、打開 PerfMon 工具 按下 Win R 打開運行窗口。…

【軟考高級系統架構論文】論NoSQL數據庫技術及其應用

論文真題 隨著互聯網web2.0網站的興起,傳統關系數據庫在應對web2.0 網站,特別是超大規模和高并發的web2.0純動態 SNS 網站上已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展。 NoSQL(Not only SQL )的產生就是為了解…

bash的配置文件,source

一.按生效范圍分類 二.按shell登錄的方式分類 這里的執行順序存疑,因為會互相調用,不需要記憶 source執行腳本 source不創建子進程,bash創建子進程 普通腳本:用bash 配置文件腳本:用source 三.按功能分類

30道C語言高頻題整理(附答案背誦版)

1.請描述一下C語言的基本數據類型有哪些&#xff1f; C語言提供了一系列的基本數據類型&#xff0c;它們是構建更復雜數據結構的基礎。這些基本數據類型主要包括&#xff1a; 整型&#xff08;Integer Types&#xff09;&#xff1a;用于存儲整數值。根據存儲大小和符號性&…

使用Tailwind CSS和i18n的react實踐

首先在 src 下設置 i18n.js 文件 // src/i18n.js import i18n from i18next; import { initReactI18next } from react-i18next;import en from ./locales/en/public; import zh from ./locales/zh/public;i18n.use(initReactI18next) .init({resources: {en: { translation:…

生信自學路線|R語言的數據變量類型與對應運算

R 是一種動態類型語言&#xff0c;使用靈活&#xff0c;變量無需預先聲明類型。掌握 R 的數據類型和變量機制&#xff0c;是后續進行數據處理和建模分析的基礎。本章節主要介紹 R 語言中的常量、變量、基本數據類型及常用數據結構&#xff0c;并結合示例進行說明。 文章目錄 一…

UI前端大數據處理優化策略:提升數據處理速度與準確性

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字化浪潮下&#xff0c;前端面臨的數據規模正呈指數級增長 ——IDC 預測&#xff0c;2025…