Flutter连接SignalR遇连接拒绝错误,需实现安卓模拟器跨设备消息传递
Flutter连接ASP.NET SignalR 连接拒绝问题解决方案
问题说明
Flutter连接SignalR时抛出错误:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Connection refused during connect signalR in flutter
需求是通过ASP.NET SignalR实现两个安卓模拟器间的消息传递,以下是针对性的修复方案:
核心修复点
1. 修正SignalR连接地址
安卓模拟器中127.0.0.1指向模拟器自身,而非运行ASP.NET后端的电脑,需替换为以下地址之一:
- Android Studio模拟器:使用
http://10.0.2.2:5231/signalrHub(10.0.2.2是模拟器映射电脑本地回环地址的特殊IP) - 真实设备/其他模拟器:使用电脑的局域网IP(如
http://192.168.1.100:5231/signalrHub,可通过ipconfig/ifconfig查询)
修改Flutter代码中的initSignalR方法:
void initSignalR() async { hubConnection = HubConnectionBuilder() // 替换为正确的地址 .withUrl("http://10.0.2.2:5231/signalrHub") .build(); // ... 其他代码 }
2. 配置ASP.NET后端跨域支持
Flutter客户端属于跨域请求,需在ASP.NET中添加CORS配置:
修改ASP.NET的Program.cs:
using FlutterBackendSignalR.Hubs; var builder = WebApplication.CreateBuilder(args); // 添加CORS服务,允许本地开发请求(生产环境需限制具体域名) builder.Services.AddCors(options => { options.AddPolicy("AllowLocal", policy => { policy.WithOrigins("http://localhost:5231", "http://10.0.2.2:5231") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // SignalR需要此配置支持认证信息传递 }); }); builder.Services.AddRazorPages(); builder.Services.AddSignalR(); var app = builder.Build(); // ... 其他中间件配置 // 在UseRouting之后、UseAuthorization之前添加CORS中间件 app.UseCors("AllowLocal"); app.UseAuthorization(); app.MapRazorPages(); app.MapHub<ModelViewHub>("/signalrHub"); app.Run();
3. 异步启动SignalR连接
hubConnection.start()是异步方法,必须添加await,否则会跳过等待直接执行后续代码,导致错误捕获不及时:
修改Flutter的initSignalR方法:
void initSignalR() async { hubConnection = HubConnectionBuilder() .withUrl("http://10.0.2.2:5231/signalrHub") .build(); hubConnection.on("ReceiveMessage", _handleMessage); try { await hubConnection.start(); // 添加await等待连接完成 print("SignalR connected successfully!"); } catch (e) { print("Error connecting to SignalR: $e"); } }
4. 检查端口一致性
确认ASP.NET后端实际运行的端口是5231:
- 查看项目
Properties/launchSettings.json中的applicationUrl配置,确保与Flutter代码中的端口一致。
5. 确保Flutter应用拥有网络权限
在android/app/src/main/AndroidManifest.xml中添加INTERNET权限:
<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <!-- 其他配置 --> </manifest>
验证步骤
- 重启ASP.NET后端服务
- 在两个安卓模拟器中分别运行Flutter应用
- 发送消息,验证是否能互相接收
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

