模拟器调用Web API超时求助:连接192.168.0.105:7270失败
解决模拟器调用本地Web API超时问题
错误分析
从报错信息来看,Android模拟器(IP 10.0.2.16)无法连接到局域网内的API服务(192.168.0.105:7270),核心问题在于模拟器网络与宿主机局域网的隔离限制,再结合可能的API绑定配置、证书信任或防火墙拦截等因素导致超时。
分步解决方案
1. 替换模拟器访问的IP地址
Android默认模拟器使用10.0.2.2作为宿主机的专属映射地址,直接使用局域网IP会被模拟器网络隔离。修改MonkeyService中的请求地址:
// 将原局域网IP替换为模拟器映射的宿主机地址 var response = await httpClient.GetAsync("https://10.0.2.2:7270/api/GetCust");
- 若使用Genymotion模拟器,替换为
10.0.3.2
2. 确保API服务允许外部访问
检查后端API的绑定配置,不能仅绑定127.0.0.1(仅本地可访问),需绑定0.0.0.0或局域网IP:
- 以ASP.NET Core为例,修改
launchSettings.json中的applicationUrl:"applicationUrl": "https://0.0.0.0:7270;http://0.0.0.0:7271" - 启动API后,用宿主机浏览器访问
https://192.168.0.105:7270/api/GetCust,确认API能正常返回数据。
3. 处理HTTPS证书信任问题
模拟器默认不信任自签名HTTPS证书,可选择两种方式:
- 测试阶段改用HTTP:将请求地址改为
http://10.0.2.2:7270/api/GetCust,同时在Android项目的AndroidManifest.xml中添加配置:<!-- 添加网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 允许明文流量(Android 9+必填) --> <application ... android:usesCleartextTraffic="true"> - 导入证书到模拟器:导出API的自签名证书,通过模拟器的安全设置导入为系统信任证书。
4. 检查防火墙与端口
- 临时关闭宿主机防火墙测试,或在防火墙中添加入站规则,允许7270端口的TCP流量。
- 确认局域网内其他设备能访问
192.168.0.105:7270,排除网络本身的问题。
5. 代码健壮性优化
当前代码在请求失败时会返回null,可能导致ViewModel中循环报错,建议修改MonkeyService:
public async Task<List<Monkey>> GetMonkeys() { if (monkeyList?.Count > 0) return monkeyList; monkeyList = new List<Monkey>(); // 初始化空列表,避免返回null try { var response = await httpClient.GetAsync("https://10.0.2.2:7270/api/GetCust"); if (response.IsSuccessStatusCode) { monkeyList = await response.Content.ReadFromJsonAsync<List<Monkey>>() ?? new List<Monkey>(); } } catch (Exception ex) { Debug.WriteLine($"API请求失败: {ex.Message}"); } return monkeyList; }
内容的提问来源于stack exchange,提问作者abdulraheem alarpi
相关产品推荐
相关产品推荐

