Xamarin Forms Android应用用RestSharp调用本地Web API遇连接失败
解决Xamarin Forms Android访问Web API时的ConnectFailure (No route to host)错误
看起来你遇到的是Android模拟器无法连接到本地Web API的典型问题,我来帮你一步步排查和解决:
1. 确认Web API的监听配置
首先要确保你的Web API允许外部设备(包括模拟器)访问:
- 如果是用ASP.NET Core:在
Program.cs(旧版本是Startup.cs)里,确保启动时绑定的地址是http://0.0.0.0:51262而不是仅http://localhost:51262。这样API会监听所有网络接口,而不仅仅是主机的本地回环地址。// ASP.NET Core 6+ 示例 var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://0.0.0.0:51262"); - 如果是用IIS Express:默认情况下IIS Express只允许本地访问。你需要修改配置文件来允许外部访问:
然后重启IIS Express和API。找到项目目录下的
.vs\config\applicationhost.config,找到你的API站点的<bindings>节点,添加一个绑定到0.0.0.0的条目:<binding protocol="http" bindingInformation="*:51262:*" />
2. 检查Android的网络权限和明文HTTP限制
Android 9(API 28)及以上默认禁用明文HTTP请求,同时你需要确保应用有网络访问权限:
- 在Android项目的
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 如果你的API用的是HTTP而不是HTTPS,需要配置允许明文HTTP:
在Android项目的Resources/xml目录下创建network_security_config.xml(如果没有就新建),内容如下:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">10.0.2.2</domain> </domain-config> </network-security-config>AndroidManifest.xml的<application>标签里引用这个配置:<application ... android:networkSecurityConfig="@xml/network_security_config">
3. 排查主机防火墙设置
你的Windows防火墙可能阻止了模拟器对51262端口的访问:
- 打开Windows Defender防火墙,进入“高级设置”。
- 添加入站规则,允许TCP协议的51262端口的所有连接,或者指定模拟器的IP段(通常是10.0.2.0/24)。
4. 验证连接的基本可用性
可以先在模拟器的浏览器里访问http://10.0.2.2:51262/api/portfolio,看看是否能正常返回数据。如果浏览器也打不开,那问题大概率在API的配置或防火墙,而不是RestSharp的代码。
5. 检查RestSharp的代码细节
最后再确认你的RestSharp代码有没有小问题:
- 确保
RestClient的基地址末尾有斜杠(你已经加了,这点没问题)。 - 如果你用的是最新版RestSharp,注意它的API有些变化,比如默认请求方法就是GET,也可以直接用泛型的
GetAsync简化代码:public async Task<List<ETFPortfolio>> GetPortfolios() { var client = new RestClient("http://10.0.2.2:51262/api/"); var request = new RestRequest("portfolio"); // 按需添加请求头 request.AddHeader("Accept", "application/json"); var response = await client.GetAsync<List<ETFPortfolio>>(request); return response; }
按照上面的步骤一步步排查,应该能解决你的连接问题。
内容的提问来源于stack exchange,提问作者Jannik
相关产品推荐
相关产品推荐

