我正在尝试从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的代码。
问题:
配置
使用共享运行时: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
我尝试过的事情:
。net核心控制台应用程序SocketsHttpHandler使用的HttpConnectionSettings具有http2支持代码:
但是在xamarin上没有。选择了AndroidClientHandler,但将t委托给SocketsHttpHandler。它的设置不支持http2:
我让您可以使用您提供的解决方案。抱歉,我没有介绍您的方式为何不起作用的确切细节,而这一方法起作用了。我也无法测试iOs版本。
服务器。我只更改了端口版本。我使用发行版。顺便说一句,我不确定您如何成功运行Http1AndHttp2以及相同的ip和port。我在个人项目上遇到了问题。
手机向两个项目添加了Grpc.Core和Grpc.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擅长将多个客户端保持在一个流上。您可以重新创建便宜的客户端。