如何让MonoAndroid平台的GrpcChannel使用HTTP/2协议?
问题根因
monoandroid10.0(对应API 30)运行时默认优先使用Android原生的AndroidMessageHandler作为HTTP处理器,该处理器不会对明文HTTP请求主动启用HTTP/2支持,最终导致GrpcChannel发起的请求降级为HTTP/1.1,和服务端要求的HTTP/2协议不匹配。
解决步骤
- 显式为GrpcChannel指定启用了HTTP/2明文支持的
SocketsHttpHandler,强制请求默认使用HTTP/2版本 - 若使用明文HTTP请求地址,需在AndroidManifest.xml的
application节点添加android:usesCleartextTraffic="true"配置,避免Android系统拦截明文请求 - 可在Android项目的.csproj文件的
PropertyGroup节点添加以下配置,全局指定HTTP处理器为SocketsHttpHandler,避免其他HTTP请求出现类似问题:<AndroidHttpClientHandlerType>System.Net.Http.SocketsHttpHandler, System.Net.Http</AndroidHttpClientHandlerType>
调整后可运行的代码示例
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); var address = $"http://{ServerUrl.Host}:5002"; // 显式配置Grpc通道的HTTP处理器与协议版本 using var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions { HttpHandler = new SocketsHttpHandler { DefaultRequestVersion = new Version(2, 0), DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher } }); var myServiceClient = MagicOnionClient.Create<IMyService>(channel); var result = await myServiceClient.GetMyData();
注意事项
需确认项目引用的Grpc.Net.Client、MagicOnion.Client包版本与服务端使用的版本兼容,避免出现协议序列化相关的其他异常。
内容的提问来源于stack exchange,提问作者bearpro
相关产品推荐
相关产品推荐

