我正在尝试使用针对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=all
和GRPC_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示例)。
我的观察:
这得出一个简单的结论:问题出在C#客户端上,尽管我没有解释为什么它可以在其他计算机上运行(我也在同事的计算机上对其进行了测试,并且可以在该计算机上运行)。
答案 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的库)解决了此问题。