.NET 6 中的 HTTP/3 支持

来源: OSCHINA
编辑: 局长
2021-09-23

根据官方博客的介绍,.NET 6 提供了对 HTTP/3 的预览支持,主要包括以下场景:

  • 在 Kestrel、HTTP.Sys 和 IIS 中,用于 ASP.NET 服务器
  • 在 HttpClient 中发送 outbound 请求
  • 面向 gRPC

.NET 开发团队表示,HTTP/3 的 RFC 还没有最终确定,但他们还是将 HTTP/3 引入到了 .NET 6 中,方便用户开始进行试验,但这只是 .NET 6 的预览功能——因为它不符合 .NET 6 其余部分的质量标准。因此需要与其他服务器和客户端进行更广泛的测试以确保兼容性,尤其是在边界情况下。

试用 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,但他们认为最好不要引入未与操作系统的证书管理集成的附加依赖项。

示例

使用 HTTP/3 的 gRPC

gRPC 是一种使用 protobuf 序列化格式的 RPC 机制。gRPC 通常使用 HTTP/2 作为其传输。HTTP/3 使用了相同的语义,因此几乎不需要更改即可使其工作。gRPC over HTTP/3 由 .NET 团队提出,目前还不是一个标准。

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);

详情查看官方博客

展开阅读全文
4 收藏
分享
加载中
精彩评论
在语言上,C#是很先进的,要不怎么后来Java, JS等等都去学C#的一些语言特性呢, await, async, using, c#风格的lambda等等。
2021-09-23 10:38
13
举报
中国没有HTTP/3,全都QOS了
2021-09-27 03:01
2
举报
net这代码怎么这么好看
2021-09-23 08:43
2
举报
HTTP/3 的 RFC 还没有最终确定,但他们还是将 HTTP/3 引入到了 .NET 6 中,方便用户开始进行试验,但这只是 .NET 6 的预览功能——因为它不符合 .NET 6 其余部分的质量标准。
什么叫社区影响力doge
2021-09-26 16:27
1
举报
宇宙第一ide和优雅的语法糖,微软再不发力生态就可要彻底毁了。
2021-09-23 17:25
1
举报
最新评论 (11)
2都还没有用,3就来了
2021-09-27 10:29
0
回复
举报
中国没有HTTP/3,全都QOS了
2021-09-27 03:01
2
回复
举报
HTTP/3 的 RFC 还没有最终确定,但他们还是将 HTTP/3 引入到了 .NET 6 中,方便用户开始进行试验,但这只是 .NET 6 的预览功能——因为它不符合 .NET 6 其余部分的质量标准。
什么叫社区影响力doge
2021-09-26 16:27
1
回复
举报
http2都没普及
2021-09-23 08:54
1
回复
举报
主要是要证书,懒得配置证书,就用http1.1吧
2021-09-23 10:29
0
回复
举报
还行吧,目前我们用的都是http/2,挺好的
2021-09-23 14:24
0
回复
举报
java有http2client吗?
2021-09-29 23:54
0
回复
举报
okhttp就行吧
2021-10-06 13:20
0
回复
举报
net这代码怎么这么好看
2021-09-23 08:43
2
回复
举报
在语言上,C#是很先进的,要不怎么后来Java, JS等等都去学C#的一些语言特性呢, await, async, using, c#风格的lambda等等。
2021-09-23 10:38
13
回复
举报
宇宙第一ide和优雅的语法糖,微软再不发力生态就可要彻底毁了。
2021-09-23 17:25
1
回复
举报
更多评论
11 评论
4 收藏
分享
返回顶部
顶部