为什么Xamarin Android无法发送GRPC / Http2请求?

问题描述 投票:0回答:1

我正在尝试从Dot net conf 2019 keynote运行xamarin表单示例。我已经托管了grpc服务,.net核心控制台应用程序可以从中获取数据而不会出现任何问题。但是,在运行xamarin应用程序时,HTTP 1.1会发生ALPN协商(客户端问候),因此grpc调用会失败。Source code available here

错误消息:Grpc.Core.RpcException:Status(StatusCode = Internal,Detail =“错误的gRPC响应。响应协议降级为HTTP / 1.1。”

调试器显示在xamarin下使用的SocketsHttpHandler没有支持Http 2的代码。

问题:

  1. 显然Xamarin支持Grpc和Http。为什么会失败?鉴于我的怀疑是正确的,所以出现问题是因为xamarin使用了不支持Http2的旧版本的System.Net.Http.dll。
  2. 如何确保Xamarin使用支持Http2的正确运行时程序集?
  3. 如果对某人有用,可以请您共享系统配置吗?

配置

使用共享运行时:trueMono共享的运行时版本(在android设备上看到):10.1.0-18。Windows 10上的Visual Studio 2019:Xamarin.Android SDK 10.1.4.0(d16-4 / e44d1ae)Xamarin.Android参考程序集和MSBuild支持。单声道:fd9f379Java.Interop:xamarin/java.interop/[email protected]工具:xamarin / xamarin-android-tools / d16-5 @ 9f4ed4b

我尝试过的事情:

  1. 切换到托管的HttpClient实现/ NativeMessageHandler来自ModernHttpClient。仍然失败,并出现相同的错误。 (因为ALPN协商仍使用相同的代码吗?)
  2. 在新的HttpClient上发送带有版本2的HttpRequestMessage。仍然基础处理程序是相同的。因此它无法协商Http2。
  3. 禁用共享运行时。没用。

。net核心控制台应用程序SocketsHttpHandler使用的HttpConnectionSettings具有http2支持代码:HttpConnectionSettings used by the SocketsHttpHandler has http2 supporting code

但是在xamarin上没有。选择了AndroidClientHandler,但将t委托给SocketsHttpHandler。它的设置不支持http2:Xamarin fails

android xamarin grpc http2
1个回答
1
投票

我让您可以使用您提供的解决方案。抱歉,我没有介绍您的方式为何不起作用的确切细节,而这一方法起作用了。我也无法测试iOs版本。

服务器。我只更改了端口版本。我使用发行版。顺便说一句,我不确定您如何成功运行Http1AndHttp2以及相同的ip和port。我在个人项目上遇到了问题。

手机向两个项目添加了Grpc.CoreGrpc.Core.Api nuget。

我正在以其他方式创建频道。您的解决方案版本

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

我的版本已更改为

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

这不是一个非常安全的版本,但是可以使用一段时间,因为http2已经是二进制文件。创建并使用安全的方式来签署证书并在服务器和客户端中使用它。很好的例子是here

另外,我建议重用渠道,因为创建新渠道的成本很高。 Http2擅长将多个客户端保持在一个流上。您可以重新创建便宜的客户端。

© www.soinside.com 2019 - 2024. All rights reserved.