Я пытаюсь заставить работать базовый клиент и сервер gRPC C #, используя привязки .Net для официальной библиотеки grpc (версия 1.20).Но каждый раз, когда мои клиентские вызовы не достигают сервера с этой ошибкой:
Grpc.Core.RpcException: Status(StatusCode=Unknown, Detail="Stream removed")
Сбой является немедленным (нет ожидания или тайм-аута) и постоянным.
Это включает в себя всеофициальные примеры 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" });
Я также попытался вызвать сервер с клиентом BloomRPC , с тем же сообщением об ошибке.
Реализация службы сервера не вызывается ив логах сервера ничего не написано (с GRPC_TRACE=all
и GRPC_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}
Порт сервера отображается в Диспетчере ресурсов открытым, я могу вызвать сервер с помощью 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 #, хотя у меня нет объяснения, почемуон работает на других компьютерах (я также проверил его на компьютере моих коллег и он там работает).