.NET 6 中的 HTTP/3 支持
根據官方博客的介紹,.NET 6 提供了對(duì) HTTP/3 的預覽支持,主要包括以下場景:
在 Kestrel、HTTP.Sys 和 IIS 中,用于 ASP.NET 服務器
在 HttpClient 中發(fā)送 outbound 請求
面(miàn)向(xiàng) gRPC
.NET 開(kāi)發(fā)團隊表示,HTTP/3 的 RFC 還(hái)沒(méi)有最終确定,但他們還(hái)是將(jiāng) HTTP/3 引入到了 .NET 6 中,方便用戶開(kāi)始進(jìn)行試驗,但這(zhè)隻是 .NET 6 的預覽功能(néng)——因爲它不符合 .NET 6 其餘部分的質量标準。因此需要與其他服務器和客戶端進(jìn)行更廣泛的測試以确保兼容性,尤其是在邊界情況下。
試用 HTTP/3
如需使用 HTTP/3,需安裝 MSQuic 及其 TLS 依賴項。
目前隻支持 Windows 和 Linux,.NET 6 暫不支持 macOS 上的 HTTP/3,主要是因爲缺少與 QUIC 兼容的 TLS API。.NET 團隊認爲,由于 .NET 在 macOS 上使用 SecureTransport 來實現其 TLS 實現,它尚未包含支持 QUIC 握手的 TLS API。雖然可以使用 OpenSSL,但他們認爲最好(hǎo)不要引入未與操作系統的證書管理集成(chéng)的附加依賴項。
示例
使用 HTTP/3 的 gRPC
gRPC 是一種(zhǒng)使用 protobuf 序列化格式的 RPC 機制。gRPC 通常使用 HTTP/2 作爲其傳輸。HTTP/3 使用了相同的語義,因此幾乎不需要更改即可使其工作。gRPC over HTTP/3 由 .NET 團隊提出,目前還(hái)不是一個标準。
ASP.NET Server
var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddGrpc(); builder.WebHost.ConfigureKestrel((context, options) =>{ options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http3; listenOptions.UseHttps(); }); });var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.MapGrpcService<GreeterService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();
Client
using Grpc.Net.Client;using GrpcService1;using System.Net;var httpClient = new HttpClient(); httpClient.DefaultRequestVersion = HttpVersion.Version30; httpClient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions() { HttpClient = httpClient });var client = new Greeter.GreeterClient(channel);var response = await client.SayHelloAsync(new HelloRequest { Name = "World" }); Console.WriteLine(response.Message);