我正在尝试从 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 服务器?