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

我正在尝试使用.aa绑定的official grpc library(版本1.20)使基本的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),所有这些都在同一端。

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

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

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

我的观察:

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

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

参考方案

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

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

在xpath中选择多个条件 - php

我正在尝试使用来自高尔夫比赛的xml提要,以显示每个高尔夫球手在高尔夫球场上的位置。目前,我想展示符合两个条件的所有高尔夫球手(排在前25名,以及所有加拿大高尔夫球手)。这是xml提要的示例。<GolfDataFeed Type="Leaderboards" Timestamp="3/21/2012 9:18:09 PM&…

jQuery不起作用 - php

我正在使用带有ajax的jquery。有时,给出错误$未定义。这是我的代码:<script language="javascript" type="text/javascript"> var base_path="<? echo $this->baseUrl().'/…

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…