gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:16:07 28 4
gpt4 key购买 nike

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

错误消息:Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Bad gRPC response.Response protocol downgraded to HTTP/1.1."

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

问题:

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

配置

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

我尝试过的事情:

  1. 切换到 Managed HttpClient implementation/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 委托(delegate)给 SocketsHttpHandler。它的设置不支持 http2: Xamarin fails

最佳答案

我让它运行您提供的解决方案。抱歉,我没有详细说明为什么您的方法不起作用而这个方法起作用了。我也无法测试 iOs 版本。

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

移动向两个项目添加了 Grpc.CoreGrpc.Core.Api nugets。

我正在以不同的方式创建 channel 。您的解决方案版本

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

我的版本改为

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

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

我还建议重用 channel ,因为创建新 channel 的成本很高。 Http2 善于将多个客户端保持在一个流上。您可以重新创建成本低廉的客户。


来自 MS 的一点更新 https://learn.microsoft.com/en-us/aspnet/core/grpc/client?view=aspnetcore-3.1

Calling gRPC over HTTP/2 with Grpc.Net.Client is currently notsupported on Xamarin. We are working to improve HTTP/2 support in afuture Xamarin release. Grpc.Core and gRPC-Web are viable alternativesthat work today.

关于android - 为什么 Xamarin Android 无法发送 GRPC/Http2 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60360430/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com