【问题标题】:Is it possible to use gRPC with HTTP/1.1 in .NET Core?是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 一起使用?
【发布时间】:2020-05-03 08:41:39
【问题描述】:

我有两个网络服务——一个 gRPC 客户端和一个 gRPC 服务器。服务器是用 .NET Core 编写的,hence HTTP/2 for gRPC is enforced。但是,客户端是托管在 IIS 8.5 上的 .NET Framework 4.7.2 Web 应用程序so it only supports HTTP/1.1

由于升级客户端需要一些时间,我在想是否可以在服务器端使用 HTTP/1.1 而不是 HTTP/2,但我找不到任何信息来实现这一点。

.NET Core 编写的 gRPC 服务器是否可以使用 HTTP/1.1?如果是这样 - 如何?

【问题讨论】:

    标签: c# asp.net-core grpc http2 http-1.1


    【解决方案1】:

    不,您不能在 HTTP 1.1 上使用 gRPC;但是,您可以使用 Grpc.Core Google 传输实现,而不是托管的 Microsoft 位;这针对 .NET Standard 1.5 和 .NET Standard 2.0,因此应该适用于 .NET Core,并使用特定于操作系统的非托管二进制文件 (chttp2) 进行传输。

    对于客户端,两者几乎没有区别;只有实际的频道创建发生变化,在:

    GrpcChannel.ForAddress(...)
    

    使用 Microsoft 传输,并且

    new Channel(...)
    

    使用 Google 传输。其余所有 API 都是共享的(在 Grpc.Core.Api 中)

    【讨论】:

    • 如果我使用微软传输新通道(...),那么它必须是 HTTP/1.1 而不是 HTTP/2?如何在连接的 gRPC 通道上找到 HTTP 的版本?谢谢
    • @Marco 是什么让你这么认为?很确定它是 http/2,因为 gRPC 被 定义 为 http/2
    • @Marco 还有,new Channel 是 Google 传输,而不是 MS 传输,所以它是运行 http/2 的 chttp
    • 我查看了 GRPC 日志,没有提到 HTTP/2,只有“http”。但连接确实如 HTTP/2 预期的那样保持活动状态。谢谢
    • @marco fyi,如果你在 MS 传输之后:GrpcChannel.ForAddress(...)
    【解决方案2】:

    没有。 RPC 调用仅通过 HTTP/2 完成。这允许 gRPC 用户自动利用协议的所有功能。

    【讨论】:

    • gRPC 不使用 HTTP/1.1 不具备的任何 HTTP2 特定功能 - HTTP/1.1 通过分块编码支持响应尾,HTTP/1.1 也通过分块编码支持客户端流式传输编码(一个很少使用的 HTTP/1.1 功能,但它就在那里)。 gRPC 不能在 HTTP/1.1 上运行是一个神话。
    【解决方案3】:

    如果不需要客户端流式传输,可以使用 gRPC-Web 协议。以下是为此类服务启动客户端和服务器的方法。

    https://docs.microsoft.com/en-us/aspnet/core/grpc/browser?view=aspnetcore-6.0

    请记住,虽然它提到了 blazor,但此方法可用于非 WebAssembly 客户端。

    【讨论】:

      【解决方案4】:

      您是否尝试过使用grpc-web? 我相信它有一个使用 http1.1 而不是 2.2 的解决方法。

      有一些事情需要注意,例如预告片和流媒体,它们的工作方式略有不同,因为 http1.1 支持这些功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 2017-03-11
        相关资源
        最近更新 更多