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

时间:2019-04-18 13:39:46

标签: c# grpc

我正在尝试使用针对official grpc library(1.20版)的.Net绑定来使基本的gRPC C#客户端和服务器正常工作。但是每次我的客户呼叫都无法通过此错误到达服务器时:

Grpc.Core.RpcException: Status(StatusCode=Unknown, Detail="Stream removed")

故障是立即发生的(没有等待或超时)并且一致。

这包括所有正式的gRPC examples,它们都可以立即构建并运行,但是无法通过该错误调用服务器。例如:

// 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" });

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

不调用服务器服务实现,也不在服务器日志中写任何内容(使用GRPC_TRACE=allGRPC_VERBOSITY=debug)。 Here是具有相同设置的完整客户端日志。摘录:

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}

服务器的端口在资源管理器中显示为打开,我可以使用telnet调用服务器,并且它会以一些字节的非文本数据作为响应(并在我发送任何输入后立即断开连接)。

我尝试了客户端和服务器的主机地址的各种组合(“本地主机”,“ 127.0.0.1”,“ 0.0.0.0”,本地网络中我的计算机的名称或IP),都位于同一端。 / p>

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

有趣的是,相同的确切代码可以在我的家用计算机上正常工作,因此必须与系统有关,但是我无法确定什么。

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

我的观察:

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

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

2 个答案:

答案 0 :(得分:5)

类似于MatějZábský,我在“流已删除”错误中苦苦挣扎,但无法让我的BloomRPC调用我的代码。我的情况略有不同-我的服务器部分是使用.NET Core 3中的新Grpc.AspNetCore NuGet包编写的,而客户端使用的是Grpc.Core Nuget包(与较早的.NET Framework兼容)。为了解决这个问题,在gRPC的服务器端,我做了此更改(希望对您有所帮助):

发件人:

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

收件人:

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>();
        });

答案 1 :(得分:0)

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