3

我正在尝试从 WCF 过渡到将我们的代码库迁移到 .NET Core。我们的服务目前都作为 Windows 服务托管,因此我也在尝试自托管 gRPC 服务(而不是构建AspNetCore应用程序)。我已经使用 成功构建了一个服务器Grpc.Core.Server,客户端也使用Grpc.Net.Client.GrpcChannel,请参阅下面的代码片段以供参考。

服务器:

  var builder = ServerServiceDefinition.CreateBuilder();
  // Binder is a small class ripped from the CodeFirst example
  var binder = new Binder();
  binder.Bind(builder, serviceType, service: serv);
  var serverServiceDefinition = builder.Build();

  var server = new Grpc.Core.Server
  {       
    Services = { serverServiceDefinition },
    Ports = { new ServerPort(host, port, ServerCredentials.Insecure) }
  };

  server.Start();

客户:

  var channel = GrpcChannel.ForAddress(Uri, new GrpcChannelOptions()
  {
    //HttpHandler = new GrpcWebHandler(new System.Net.Http.HttpClientHandler())
  });
  var service = channel.CreateGrpcService<TService>();

但是,由于我们的应用程序仍在运行,.Net Framework 4.8因此在测试此代码时出现运行时异常:

System.PlatformNotSupportedException:gRPC 需要对不支持 gRPC over HTTP/2 的 .NET 实现进行额外配置。必须使用 GrpcChannelOptions.HttpHandler 指定 HTTP 提供程序。配置的 HTTP 提供程序必须支持 HTTP/2 或配置为使用 gRPC-Web。有关详细信息,请参阅https://aka.ms/aspnet/grpc/netstandard

这导致我在客户端添加以根据错误中的链接Grpc.Net.Client.Web.GrpcWebHandler切换到。Grpc-web

但是,我现在正在努力为服务器做同样的事情来支持Grpc-web. 此处的指南建议 (1) 使用Grpc.AspNetCore.Web或 (2) 使用“Envoy 代理”来获取支持它的服务器。(1) 的问题是我没有使用AspNetCore,所以我认为这个解决方案不合适,而且我在简单的 C# 解决方案中找不到任何轻量级/简单的方法来执行 (2)。

如果没有添加服务器端支持,我会得到这个异常:

Grpc.Core.RpcException : Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: 发送请求时出错。WebException: 服务器违反了协议。Section=ResponseStatusLine", DebugException="System .Net.Http.HttpRequestException:发送请求时出错。

我认为这显然与服务器不支持Grpc-web请求的事实有关。所以我现在在这方面有点死胡同。我觉得我需要弄清楚如何自托管AspNetCore服务器并转移到它而不是Grpc.Core.Server,这将打开选项(1),但我发现几乎没有证据表明实际上是可能的。

所以我想我的主要问题是:有什么方法可以支持Grpc-web通过托管的服务器中的客户端Grpc.Core.Server

如果答案是否定的--> 我如何自托管支持Grpc-web客户端的 GRPC 服务器?

4

1 回答 1

0

根据这个入门指南,我发现protobuf-net.Grpc.Native这似乎可以解决我目前遇到的问题。我还发现我缺少 my 的默认构造函数[DataContract],我认为这与我收到的错误无关,但可能是有贡献的。

于 2021-11-04T10:25:36.077 回答