NET问答: 如何让 HttpClient 支持 Http 2.0 协议?
咨詢區(qū)
Justin Lessard:
我的一個項目需要支持 Http 2.0 進行數(shù)據(jù)的收發(fā),目前用的項目版本是 .NET Core 2.2,我選型了 HttpClient,但是我發(fā)現(xiàn)一個問題,在生產(chǎn)環(huán)境中的程序返回的 response 版本一直都是 Http 1.1,請問大家我該如何正確配置?
參考代碼:
using?(var?client?=?new?HttpClient()) {using?(var?request?=?new?HttpRequestMessage(new?HttpMethod("GET"),"https://duckduckgo.com/")){request.Version?=?new?Version(2,?0);var?response?=?await?client.SendAsync(request);Console.WriteLine(response.Version);} }回答區(qū)
Panagiotis Kanavos:
你應該用的是 .Net Core 3 之前的版本,因為在 3.0 中已經(jīng)提供了 Http 2 的支持,下面的代碼將會解決你的問題,并輸出 2.0.
class?Program{static?void?Main(string[]?args){Test();Console.ReadLine();}static?async?void?Test(){var?client?=?new?HttpClient();var?req?=?new?HttpRequestMessage(HttpMethod.Get,?"https://http2.akamai.com/demo"){Version?=?new?Version(2,?0)};var?x?=?await?client.SendAsync(req);var?version?=?x.Version;Console.WriteLine(version);}}undrivendev:
在 .NET 2.1 中,HttpClient 底層采用的是 SocketsHttpClientHandler, 這種新一代的 handler 是不支持 Http/2 的,所以這是你一直看不到 1.1 ?的原因。
另外現(xiàn)在都不推薦直接用 HttpClient,最佳模式是改成 HttpClientFactory,可以參考官方的使用案例:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0
下面是一個將 HttpClient 注冊為 typeClient 并且配置成 http/2 的例子。
public?void?ConfigureServices(IServiceCollection?services) { ...services.AddHttpClient<ExampleService>().ConfigureHttpClient((client)?=>{client.DefaultRequestVersion?=?new?Version(2,?0);}); ... }點評區(qū)
其實網(wǎng)絡上有很多關于描述 HttpClient 的弊端,比如無法有效的感知 url 的 DNS 變更,network 上的 4min 問題,大家還是有必要明白這些問題的解決方案 ?HttpClientFactory,從這一系列例子上,.NET Core 3 開始已經(jīng)是一本相對功能齊全,穩(wěn)定的版本了,項目能升級到3.0的盡快升級。
總結
以上是生活随笔為你收集整理的NET问答: 如何让 HttpClient 支持 Http 2.0 协议?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET测试用例写的好不好?让变种来测试
- 下一篇: dotnet 通过引用 msbuild