Angular Capacitor应用连接本地.NET Core 6.0 API遇连接超时问题
你遇到的net::ERR_CONNECTION_TIMED_OUT和CORS相关问题,主要是几个关键配置遗漏和环境问题导致的,下面逐一说明并给出解决办法:
一、当前遗漏的关键配置
1. CORS未包含Capacitor Android的请求Origin
Android端Capacitor发起的请求,Origin并不是你配置的http://localhost:xxx,而是capacitor://localhost(部分版本是http://localhost),你的CORS策略里没包含这个Origin,会被API拒绝。
修改CORS配置,添加Capacitor专属Origin:
builder.Services.AddCors(corsBuilder => corsBuilder.AddPolicy("AllowSpecific", corsBuilderObj => { corsBuilderObj.WithOrigins( "http://localhost:4200", "http://localhost:4300", "http://localhost:8100", "http://localhost", "capacitor://localhost", // 新增Capacitor Android Origin "ionic://localhost" // 若用Ionic+Capacitor可补充 ) .AllowAnyMethod() .AllowAnyHeader(); }));
注意:别忘了在中间件管道中启用CORS,要放在app.UseRouting()之后、app.UseAuthorization()之前:
app.UseCors("AllowSpecific");
2. 电脑防火墙拦截了API端口
运行API的电脑防火墙可能阻止了局域网设备访问5103端口,需要手动开放:
- Windows:打开「Windows Defender防火墙」→「高级设置」→「入站规则」→「新建规则」,选择「端口」,输入
5103,允许连接,应用到所有网络类型。 - Mac:打开「系统设置」→「网络」→「防火墙」→「选项」,添加你的.NET Core应用,或直接允许5103端口入站。
3. 设备与API不在同一局域网
确保你的Android设备和运行API的电脑连接的是同一个WiFi网络,否则局域网IP无法互通。
4. Angular应用未更新API地址
检查Angular代码中所有API请求的地址,是否仍硬编码为http://localhost:5103,需要替换为http://192.168.x.x:5103。
二、其他替代方案(开发环境推荐)
1. Capacitor代理配置
在capacitor.config.ts中配置代理,让Angular继续用/api路径请求,自动转发到局域网API,无需修改代码中的地址:
import { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { appId: 'com.your.app.id', appName: 'YourAppName', webDir: 'dist/your-angular-app', server: { cleartext: true, // 开发环境允许HTTP请求(生产需改用HTTPS) proxy: { '/api': { target: 'http://192.168.x.x:5103', changeOrigin: true } } } }; export default config;
配置后,Angular请求/api/users会自动转发到http://192.168.x.x:5103/api/users,CORS只需允许Angular dev server的http://localhost:4200即可。
2. ADB反向代理(USB连接设备时用)
如果Android设备通过USB连接电脑,可使用ADB命令将设备的端口映射到电脑的API端口:
adb reverse tcp:5103 tcp:5103
这样Android应用里请求http://localhost:5103会直接映射到电脑的5103端口,无需修改API地址,CORS配置也不用调整。
内容的提问来源于stack exchange,提问作者Hakuna Matata

