You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:05