.NET 6 中的 HTTP/3 支持
根據(jù)官方博客的介紹,.NET 6 提供了對(duì) HTTP/3 的預(yù)覽支持,主要包括以下場(chǎng)景:
- 在 Kestrel、HTTP.Sys 和 IIS 中,用于 ASP.NET 服務(wù)器
- 在 HttpClient 中發(fā)送 outbound 請(qǐng)求
- 面向 gRPC
.NET 開(kāi)發(fā)團(tuán)隊(duì)表示,HTTP/3 的 RFC 還沒(méi)有最終確定,但他們還是將 HTTP/3 引入到了 .NET 6 中,方便用戶(hù)開(kāi)始進(jìn)行試驗(yàn),但這只是 .NET 6 的預(yù)覽功能——因?yàn)樗环?.NET 6 其余部分的質(zhì)量標(biāo)準(zhǔn)。因此需要與其他服務(wù)器和客戶(hù)端進(jìn)行更廣泛的測(cè)試以確保兼容性,尤其是在邊界情況下。
試用 HTTP/3
如需使用 HTTP/3,需安裝 MSQuic 及其 TLS 依賴(lài)項(xiàng)。
目前只支持 Windows 和 Linux,.NET 6 暫不支持 macOS 上的 HTTP/3,主要是因?yàn)槿鄙倥c QUIC 兼容的 TLS API。.NET 團(tuán)隊(duì)認(rèn)為,由于 .NET 在 macOS 上使用 SecureTransport 來(lái)實(shí)現(xiàn)其 TLS 實(shí)現(xiàn),它尚未包含支持 QUIC 握手的 TLS API。雖然可以使用 OpenSSL,但他們認(rèn)為最好不要引入未與操作系統(tǒng)的證書(shū)管理集成的附加依賴(lài)項(xiàng)。
示例
使用 HTTP/3 的 gRPC
gRPC 是一種使用 protobuf 序列化格式的 RPC 機(jī)制。gRPC 通常使用 HTTP/2 作為其傳輸。HTTP/3 使用了相同的語(yǔ)義,因此幾乎不需要更改即可使其工作。gRPC over HTTP/3 由 .NET 團(tuán)隊(duì)提出,目前還不是一個(gè)標(biāo)準(zhǔn)。
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);
詳情查看官方博客。
本站新聞禁止未經(jīng)授權(quán)轉(zhuǎn)載,違者依法追究相關(guān)法律責(zé)任。授權(quán)請(qǐng)聯(lián)系:oscbianji#oschina.cn
本文標(biāo)題:.NET 6 中的 HTTP/3 支持
本文地址:https://www.oschina.net/news/161364/http-3-support-in-dotnet-6