.NET 8 MAUI应用Android端GraphQLHttpClient连接失败,Windows端正常
问题核心原因
Windows环境下的localhost指向开发机本身,但Android设备(模拟器或真机)里的localhost是设备自身的回环地址,导致请求根本没发送到你的开发机后端服务器,这就是服务器日志没收到请求的原因。
解决方案
1. 替换localhost为开发机局域网IP
- 打开Windows命令提示符,输入
ipconfig,找到当前网络(WLAN/以太网)的IPv4地址(比如192.168.1.100) - 把代码中的
Url变量值从https://localhost:5001替换为https://[你的局域网IP]:5001 - 同时确保后端Kestrel允许局域网访问,在Program.cs中添加配置:
builder.WebHost.UseUrls("https://0.0.0.0:5001");
2. Android模拟器专用映射地址
如果使用Android Studio自带的模拟器,可以直接用10.0.2.2代替localhost,这个地址是模拟器官方提供的、映射到宿主开发机的回环地址,把Url改成https://10.0.2.2:5001即可。
3. 端口转发(可选)
通过adb命令建立设备到开发机的端口转发:
adb reverse tcp:5001 tcp:5001
执行后,Android设备访问localhost:5001就会转发到开发机的5001端口。
4. 处理HTTPS证书信任问题
.NET 8对HTTPS证书的验证更严格,Android默认不信任开发环境的自签名证书,可能导致连接失败:
- 调试阶段可以临时改用HTTP:修改后端启用HTTP端口(比如5000),Url改成
http://[局域网IP]:5000 - 生产或需要HTTPS时,将开发机的HTTPS证书导出为.crt格式,放到Android项目的
Resources/raw目录,然后在代码中配置信任该证书。
代码修改示例
// 替换为你的开发机局域网IP private const string Url = "https://192.168.1.100:5001"; private static async Task<(RootObject obj, string rtnMsg)> GetDocumentAsync(string iQuery) { RootObject obj = null; string rtnMsg = ""; var graphQLOptions = new GraphQLHttpClientOptions { EndPoint = new Uri($"{Url}/graphql", UriKind.Absolute) }; var graphQLHttpClient = new GraphQLHttpClient(graphQLOptions, new NewtonsoftJsonSerializer()); var documentRequest = new GraphQLRequest { Query = iQuery }; try { var graphQLResponse = await graphQLHttpClient.SendQueryAsync<RootObject>(documentRequest); Debug.Print(""); return (graphQLResponse.Data,""); } catch (Exception ex) { rtnMsg = ex.Message + " [ErpPart.GetDocumentAsync]"; Debug.Print(ex.Message); return (obj,rtnMsg); } }
内容的提问来源于stack exchange,提问作者BumpaRoy
相关产品推荐
相关产品推荐

