如何通过纯HTTP在C#Kestrel Web服务器中启用http2?

j

我如何(并且有可能)在C#Kestrel Web服务器上通过纯HTTP启用HTTP2?所有Microsoft文档均指示必须使用https / TLS,但我拥有将在负载均衡器或nginx之后运行的服务,因此不需要第二层https。官方的http2规范指示不需要https。

j

使用未加密的http2的方案是负载平衡器,代理等。

您必须做三件事才能在未加密的通道上使用http2。

  • 设置Kestrel以在服务器上使用http2:
builder.ConfigureWebHostDefaults((webBuilder) =>
{
    // this will keep your other end points settings such as --urls parameter
    webBuilder.ConfigureKestrel((options) =>
    {
        // trying to use Http1AndHttp2 causes http2 connections to fail with invalid protocol error
        // according to Microsoft dual http version mode not supported in unencrypted scenario: https://docs.microsoft.com/en-us/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.0
        options.ConfigureEndpointDefaults(lo => lo.Protocols = HttpProtocols.Http2);
    });
});
  • 对于.net 5+,创建您的HttpClient实例,然后创建一条消息并指定版本:
var request = new HttpRequestMessage(HttpMethod.Get, uri)
{
    uri,
    Version = HttpVersion.Version20,
    VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher
};
  • 对于.net core 3.1及更低版本,请设置一个标志以启用未加密的http2。然后,当您创建时HttpClient,请指定版本:
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
var client = new HttpClient { BaseAddress = new Uri(baseUrl), DefaultRequestVersion = new Version(2, 0) };

如果需要在完全未加密的主机上同时支持http1和http2,则需要监听两个端口,每个http版本监听一个端口。然后,您的负载均衡器或代理将需要处理http版本并直接指向相应的端口。

您不会在浏览器上看到http2,并且可能会收到协议错误,因此在这种情况下,您可以将http1协议指令仅用于开发环境。不理想,但是至少可以让您在本地进行测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Grizzly的嵌入式Java服务器:如何启用http2

如何在Spark嵌入式Web服务器中启用HTTP / 2

在Swift2中通过HTTP2与APNS服务器通信

HTTP2 服务器推送仅适用于 Web 资产吗?

服务器如何识别HTTP2中不同客户端的头部压缩

Spring Boot HTTP2服务器推送

Jetty HTTP2服务器推送支持

如何在服务器2016上的Asp.net Core 2.2 Kestrel(自托管)中启用http / 2

是否可以在PHP的内置Web服务器中启用HTTP范围请求支持?

如何使用 Jetty 嵌入服务器在 Spring Cloud Zuul 过滤器中检索 HTTP2 帧设置?

如何使用无服务器在 CloudFront 中启用 HTTP/2 支持?

在 Node.js 中从客户端向服务器发送 HTTP2 中的多个 JSON 数据

如何正常停止使用nghttp2 asio构建的HTTP2服务器

Golang TCP服务器:如何写入HTTP2数据

为什么Chrome浏览器无法识别我的http2服务器?

Chrome浏览器为何无法识别我的http2服务器?

Websocket,服务器发送事件(SSE)和HTTP2的服务器推送之间有什么区别?

http2:服务器发送GOAWAY并关闭连接;LastStreamID = 1999

Node.js HTTP2服务器错误:套接字挂起

为什么netty http2服务器总是使用奇数作为streamId

将 Drupal 网站/服务器切换到 HTTP2 的步骤是什么

HTTP2可用,但服务器拒绝使用它,为什么会这样?

在没有第三方库的情况下,如何在Go 1.8中设置http2服务器?

哪些Web服务器支持HTTP / 2

如何使我的Web服务器用Golang编写以支持HTTP / 2服务器推送?

如何在Apache服务器上启用Http请求?

尽管服务器在响应标头中发送“ Upgrade:h2”,但无法向Apache服务器发出http2请求

当Cockpit的逆向代理的服务器块不使用时,它使用HTTP2,但是主服务器块使用它

C- HTTP Web服务器:如何缓存