无法在普通的 C# gRPC 客户端和服务器之间建立连接

Mat*_*ský 9 c# grpc

我正在尝试使用官方 grpc 库(1.20 版)的 .Net 绑定来获得基本的 gRPC C# 客户端和服务器。但是每次我的客户端调用都无法通过此错误到达服务器时:

Grpc.Core.RpcException: Status(StatusCode=Unknown, Detail="Stream removed")
Run Code Online (Sandbox Code Playgroud)

失败是立即的(没有等待或超时)并且是一致的。

这包括所有官方gRPC 示例,所有这些示例都是开箱即用的,但无法调用服务器并出现该错误。例如:

// Server
Server server = new Server
{
    Services = { Greeter.BindService(new GreeterImpl()) },
    Ports = { new ServerPort("localhost", 50051, ServerCredentials.Insecure) }
};
server.Start();
Console.ReadKey();
server.ShutdownAsync().Wait();

// Client
Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
var reply = client.SayHello(new HelloRequest { Name = "you" });
Run Code Online (Sandbox Code Playgroud)

我还尝试使用BloomRPC 客户端调用服务器,并显示相同的错误消息。

不会调用服务器服务实现,也不会在服务器日志中写入任何内容(带有GRPC_TRACE=allGRPC_VERBOSITY=debug)。以下是具有相同设置的完整客户端日志。值得注意的摘录:

D0418 14:53:48.801298 0 ...: set_final_status CLI
D0418 14:53:48.801545 0 ...: {"created":"@1555592028.801000000","description":"Error received from peer","file":"...","file_line":1036,"grpc_message":"Stream removed","grpc_status":2}
I0418 14:53:48.802018 0 ...: ipv4:10.240.240.1:8080: Complete BDP ping err={"created":"@1555592028.790000000","description":"OS Error","file":"T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\iomgr\tcp_windows.cc","file_line":344,"os_error":"An established connection was aborted by the software in your host machine.\r\n","syscall":"WSASend","wsa_error":10053}
Run Code Online (Sandbox Code Playgroud)

服务器的端口在资源管理器中显示为打开状态,我能够使用 telnet 调用服务器,它以几个字节的非文本数据进行响应(并在我发送任何输入后立即断开连接)。

我尝试了客户端和服务器的主机地址的各种组合(“localhost”、“127.0.0.1”、“0.0.0.0”,我的机器名称或本地网络中的 IP),结果都是一样的。

这发生在最新的 Win10、VS 2017、.Net Core 2.1(也发生在 2.0)上。Windows 防火墙已禁用。我经常在这台机器上使用其他网络技术(例如 WCF)进行开发,但从未遇到任何此类问题。

有趣的是,完全相同的代码在我的家用机器上开箱即用,因此它必须与系统有关,但我一直无法确定是什么。

编辑:我试验了这些 C# 客户端和服务器与 Java 中的类似客户端服务器之间的通信(来自grpc-java示例)。

我的观察:

  • Java 客户端可以调用 C# 服务器。
  • C#客户端不能调用Java服务器
  • Java客户端可以调用Java服务器
  • C# 客户端无法调用 C# 服务器。

这产生了一个简单的结论:问题出在 C# 客户端上,尽管我没有解释为什么它可以在其他计算机上运行(我也在同事的计算机上对其进行了测试,并且确实可以在那里运行)。

Vic*_*r F 19

与 Mat?j Zábský 类似,我一直在努力解决“删除流”错误并且无法让我的 BloomRPC 调用我的代码。我的情况略有不同 - 我的服务器部分是用 .NET Core 3 中的新 Grpc.AspNetCore NuGet 包编写的,而客户端使用的是 Grpc.Core Nuget 包(与旧的 .NET 框架兼容)。为了修复它,在 gRPC 的服务器端,我进行了此更改(我希望这对某人有所帮助):

从:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
Run Code Online (Sandbox Code Playgroud)

到:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                // This endpoint will use HTTP/2 and HTTPS on port 5001.
                options.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                });
            });

            webBuilder.UseStartup<Startup>();
        });
Run Code Online (Sandbox Code Playgroud)


Mat*_*ský 1

我通过使用本机 .Net gRPC 库(而不是基于 ASP.Net Core 的库)解决了这个问题。