Почему Xamarin Android не может отправить запросы GRPC / Http2? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь запустить образец форм xamarin из Dot net conf 2019 keynote . Я разместил службу grp c, и консольное приложение. net может получить данные из него без каких-либо проблем. Но при запуске приложения xamarin согласование ALPN (Client hello) происходит с http 1.1, и поэтому вызов grp c завершается неудачно. Исходный код доступен здесь

Сообщение об ошибке: Grp c .Core.RpcException: Status (StatusCode = Internal, Detail = "Bad gRP C response. Протокол ответа понижен в HTTP / 1.1. "

Отладчик обнаруживает, что SocketsHttpHandler, используемый под xamarin, не имеет кода, поддерживающего Http 2.

Вопросы:

  1. Очевидно, что Xamarin поддерживает Grp c и Http. Почему это не удается? Учитывая, что мой подозреваемый является правильным, так что проблема заключается в том, что xamarin использует старую версию System. Net .Http.dll который не поддерживает Http2.
  2. Как убедиться, что Xamarin использует правильные сборки времени выполнения, поддерживающие Http2?
  3. Если это работает для кого-то, не могли бы вы поделиться конфигурацией системы?

Конфигурация

Использовать общее время выполнения: true Mono совместно используемая версия времени выполнения (как видно на устройстве android): 10.1.0-18. Visual studio 2019 по windows 10: Xamarin. Android SDK 10.1.4.0 (d16-4 / e44d1ae) Xamarin. Android Справочные сборки и поддержка MSBuild. Mono: fd9f379 Java .Interop: xamarin / java .interop / d16-4@c4e569f Xamarin. Android Инструменты: xamarin / xamarin- android -tools / d16-5@9f4ed4b

То, что я пробовал:

  1. Переключиться на управляемую реализацию HttpClient / NativeMessageHandler из ModernHttpClient. Все еще терпит неудачу с той же самой ошибкой. (Поскольку согласование ALPN все еще использует тот же код?)
  2. Отправить сообщение HttpRequestMessage с версией 2 на новом HttpClient. Тем не менее основной обработчик остается тем же. Так что не удается согласовать Http2.
  3. Отключить общее время выполнения. Не работает.

Вкл. net базовое консольное приложение HttpConnectionSettings, используемое SocketsHttpHandler, имеет код поддержки http2: HttpConnectionSettings used by the SocketsHttpHandler has http2 supporting code

Но на xamarin это не так. AndroidClientHandler выбран, но t делегируется SocketsHttpHandler. В его настройках отсутствует поддержка http2: Xamarin fails

1 Ответ

2 голосов
/ 23 февраля 2020

Я заставляю его работать с предоставленным вами решением. Извините, я не раскрыл точные детали, почему ваш путь не сработал, и этот сработал. Также я не смог протестировать iOs версию.

Сервер . Я изменил только версию порта. Я использовал релизную версию. Кстати, я не уверен, насколько успешно вы могли бы запустить Http1AndHttp2 и тот же IP и порт. У меня были проблемы с личным проектом.

Мобильный Добавлено Grp c .Core и Grp c .Core.Api nugets to оба проекта.

Я создаю канал по-разному. Версия вашего решения

var channel = GrpcChannel.ForAddress("123.123.123.123:123456");

Моя версия изменена на

var channel = new Channel("123.123.123.123:123456", ChannelCredentials.Insecure);

Это не очень безопасная версия, но она может работать некоторое время, поскольку http2 уже является двоичным. Создайте и используйте безопасный способ подписи сертификата и используйте его на сервере и клиенте. Хороший пример - здесь

Также я рекомендую повторно использовать каналы, поскольку создавать новые дорого. Http2 хорош для хранения нескольких клиентов в одном потоке. Вы можете воссоздать клиентов, что является дешевой операцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...