[英]Self hosted GRPC server
我正在尝试从 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 需要在不支持基于 HTTP/2 的 gRPC 的 .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="Errorstarting gRPC call. HttpRequestException: 发送请求时出错。WebException: 服务器违反了协议。Section=ResponseStatusLine", DebugException="System .Net.Http.HttpRequestException:发送请求时出错。
我认为这显然与服务器不支持Grpc-web
请求有关。 所以我现在在这方面处于一个死胡同。 我觉得我需要弄清楚如何自托管AspNetCore
服务器并转移到它而不是Grpc.Core.Server
,这将打开选项(1),但我发现几乎没有证据实际上是可能的。
所以我想我的主要问题是:有没有办法在通过Grpc.Core.Server
托管的服务器中支持Grpc-web
客户端?
如果答案是否定的--> 如何自托管支持Grpc-web
客户端的 GRPC 服务器?
根据这个入门指南,我发现了protobuf-net.Grpc.Native
似乎可以解决我目前protobuf-net.Grpc.Native
的问题。 我还发现我的[DataContract]
缺少一个默认构造函数,我认为这与我收到的错误无关,但可能是有贡献的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.