Xamarin.Forms gRP C Ошибка запуска вызова gRP C: неожиданное завершение потока при подключении - PullRequest
1 голос
/ 06 февраля 2020

я программирую приложение для моего исследования.

Я пытаюсь использовать gRP C в Xamarin.Forms.

gRP C находится в отдельной либрии (. NET Стандарт 2.1). Если я использую код в WPF-Core Project, все работает нормально.

Но если я пытаюсь использовать то же самое в моем Xamarin.Forms-Project, соединение не работает.

, если Я использую Строка соединения "http://my.server.com: 5050 ", я получаю эти исключения

Error starting gRPC call: unexpected end of stream on Connection{my.server.com:5050, proxy=DIRECT hostAddress=5.189.149.82 cipherSuite=none protocol=http/1.1} (recycle count=0)

, если я использую версию SSL "https://my.server.com: 5050 " Я получаю эти исключения

Error starting gRPC call: Connection closed by peer

Вот код gRP C -Libary

...
        if (connectionString.Contains("http://"))
            AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

        channel = GrpcChannel.ForAddress(connectionString);
        client = new Haushaltsbuch.HaushaltsbuchClient(channel);

        SuccsessReply reply = new SuccsessReply { Result = false };

        try
        {
            reply = client.Login(new UserRequest
            {
                User = new GRPC_User
                {
                    Username = username,
                    PassHash = passHash
                }
            });
        }
        catch (RpcException e) when (e.Status.Detail.Contains("The SSL connection could not be established"))
        {
            client = null;
            throw new CommunicationException("Fehler mit SSL-Zertifikat des Servers", e);
        }
        catch (RpcException e)
        {
            client = null;
            throw new CommunicationException("Server nicht erreichbar", e);
        }
...

Я только студент, и если я Google, то он говорит, что Xamarin Forms поддерживает GRP C. Но почему он не работает?

. Android Проект имеет пакет GRP C .Core от NuGet.

1 Ответ

1 голос
/ 07 февраля 2020

Решено путем замены

channel = GrpcChannel.ForAddress(connectionString);

на

        if (connectionString.Contains("http://"))
        {
            AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            string newConString = connectionString.Replace("http://", "");
            return new Channel(newConString, ChannelCredentials.Insecure);
        }
        else
        {
            string newConString = connectionString.Replace("https://", "");
            return new Channel(newConString, new SslCredentials());
        }

Похоже, класс GrpcChannel не работает на Andriod.

...