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

最佳答案

使用未加密的http2的方案是负载平衡器,代理等。
您必须做三件事才能在未加密的 channel 上使用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,并且很可能会收到协议(protocol)错误,因此在这种情况下,您可以将http1协议(protocol)指令仅用于开发环境。不理想,但是至少可以让您在本地进行测试。

关于c# - 如何通过纯HTTP在C#Kestrel Web服务器中启用http2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58682933/

10-12 22:34