为什么 Xamarin Android 无法发送 GRPC/Http2 请求? [英] Why does Xamarin Android fails to send GRPC/Http2 requests?

查看:18
本文介绍了为什么 Xamarin Android 无法发送 GRPC/Http2 请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试运行

但在 xamarin 上却没有.选择了 AndroidClientHandler,但 t 委托给 SocketsHttpHandler.它的设置没有 http2 支持:

解决方案

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

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

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

我正在以不同的方式创建频道.您的解决方案版本

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

我的版本改为

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

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

我还建议重用频道,因为创建新频道的成本很高.Http2 擅长将多个客户端保持在一个流上.您可以重新创建廉价操作的客户端.


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

<块引用>

目前不支持使用 Grpc.Net.Client 通过 HTTP/2 调用 gRPCXamarin 支持.我们正在努力改进 HTTP/2 支持未来的 Xamarin 版本.Grpc.Core 和 gRPC-Web 是可行的替代方案今天的工作.

I'm trying to run the xamarin forms sample from the Dot net conf 2019 keynote. I've hosted the grpc service and a .net core console application can get data from it without any issues. But when running the xamarin app, the ALPN negotiation(Client hello) happens with http 1.1 and therefore the grpc call fails. Source code available here

Error message: Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Bad gRPC response. Response protocol downgraded to HTTP/1.1."

Debugger reveals that the SocketsHttpHandler used underneath on xamarin does not have the code that support Http 2.

Questions:

  1. Apparently Xamarin supports Grpc and Http. Why does this fail? Given that my suspect is correct, so that the issue is because xamarin uses an old version of System.Net.Http.dll that doesn't support Http2.
  2. How to make sure Xamarin uses correct runtime assemblies that support Http2?
  3. If this works for someone, Can you please share the system configuration?

Configuration

Use shared runtime: true
Mono shared runtime version (as seen on android device): 10.1.0-18.
Visual studio 2019 on windows 10:
Xamarin.Android SDK 10.1.4.0 (d16-4/e44d1ae)
Xamarin.Android Reference Assemblies and MSBuild support.
Mono: fd9f379
Java.Interop: xamarin/java.interop/d16-4@c4e569f
Xamarin.Android Tools: xamarin/xamarin-android-tools/d16-5@9f4ed4b

Things I tried:

  1. Switch to Managed HttpClient implementation /NativeMessageHandler from ModernHttpClient. Still fails with same error. (Because ALPN negotiation still uses same code?)
  2. Send a HttpRequestMessage with Version 2 on a new HttpClient. Still the underlying handler is the same. So it fails to negotiate Http2.
  3. Disable shared runtime. Didn't work.

On .net core console app HttpConnectionSettings used by the SocketsHttpHandler has http2 supporting code:

But on xamarin it doesn't. AndroidClientHandler is selected, but t delegates to the SocketsHttpHandler. It's settings doesn't have the http2 support:

解决方案

I make it work your provided solution. Sorry i didnt cover exact details why your way didnt worked and this one worked. Also i couldn't test iOs version.

Server. I changed only port version. I used release version. Btw I am not sure how successfully you could run Http1AndHttp2 and same ip and port. I had issues on personal project.

Mobile Added Grpc.Core and Grpc.Core.Api nugets to both projects.

I am creating channel differently. Your solution version

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

My version changed to

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

This is not very secure version but could work for some time since http2 is already binary. Create and use secure way you need to sign certificate and use it in server and client. Good example is here

Also i recommend to reuse channels since it is expensive to create new. Http2 is good at keeping multiple clients on one stream. You could recreate clients which is cheap operation.


A little update from MS https://docs.microsoft.com/en-us/aspnet/core/grpc/client?view=aspnetcore-3.1

Calling gRPC over HTTP/2 with Grpc.Net.Client is currently not supported on Xamarin. We are working to improve HTTP/2 support in a future Xamarin release. Grpc.Core and gRPC-Web are viable alternatives that work today.

这篇关于为什么 Xamarin Android 无法发送 GRPC/Http2 请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆