You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

验证步骤

  1. 重启ASP.NET后端服务
  2. 在两个安卓模拟器中分别运行Flutter应用
  3. 发送消息,验证是否能互相接收

内容的提问来源于stack exchange,提问作者Ashwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:20:34