使用 gRPC 服务器作为主机调试 Blazor Webassembly

Posted

技术标签:

【中文标题】使用 gRPC 服务器作为主机调试 Blazor Webassembly【英文标题】:Debugging Blazor Webassembly with gRPC Server as Hosting 【发布时间】:2021-12-16 21:03:19 【问题描述】:

我有一个 Blazor WASM 应用程序,该应用程序应托管在后端中,该后端是使用 ASP.NET 上的 gRPC 和 .NET 5.0 实现的。当我尝试调试 WASM 应用程序时,一旦调试浏览器启动,我就会收到此错误:

fail: Microsoft.AspNetCore.Server.Kestrel[0]
  HTTP/2 over TLS was not negotiated on an HTTP/2-only endpoint.

所有开发证书均已安装并受信任,并且使用wss:// 方案建立了 websocket 连接。所以从我的角度来看,TLS 协商应该会成功。

我已经发现我可以通过将 Kestrel 端点设置更改为使用Http1AndHttp2 来解决这个问题,然后问题就变成了从前端到后端的 gRPC 连接由于降级到 Http/1 而失败.

所以我的问题是:在托管站点上使用 Http/2 服务器时,是否有任何选项可以调试 Blazot WASM? 如果这不可能:我能否以某种方式确定 gRPC 端点是使用 HTTP/2 传递的,而调试端点是通过 HTTP/1.1 传递的?

【问题讨论】:

GitHub上有一个关于该主题的问题:github.com/dotnet/aspnetcore/issues/38131 【参考方案1】:

以下是检查 Http/2 上的 TLS 协商限制的一些提示:

    TLS 版本 1.2 或更高版本 重新协商已禁用 压缩已禁用 最小的临时密钥交换大小: 椭圆曲线 Diffie-Hellman (ECDHE) [RFC4492]:最少 224 位 有限域 Diffie-Hellman (DHE) [TLS12]:最少 2048 位 密码套件不被禁止。

【讨论】:

【参考方案2】:

所以解决方案很简单:我使用了错误的包。将 Blazor 与 gRPC 一起使用时,必须使用 Grpc.Client.Net.Web 包(如本文所述:https://docs.microsoft.com/en-us/aspnet/core/grpc/browser?view=aspnetcore-6.0#configure-grpc-web-with-the-net-grpc-client)。

那么您不必使用 HTTP/2,一切都像魅力一样工作。

【讨论】:

以上是关于使用 gRPC 服务器作为主机调试 Blazor Webassembly的主要内容,如果未能解决你的问题,请参考以下文章

是否可能:使用 Blazor 服务器端作为客户端应用程序

使用 gRPC-UI 调试.NET 5的gPRC服务

Blazor WebAssembly + Grpc Web=未来?

Blazor WebAssembly + Grpc Web = 未来?

ASP.NET Core 5 Blazor WASM、gRPC、Entity Framework Core 5:多对多导致堆栈溢出

Grpc令牌过期处理