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

Flutter无法接收C# Web API的SignalR消息问题排查

可能的故障原因及排查方向

1. IHubContext 注入错误

API 中的 _hubContext 若未正确注入 IHubContext<DangerReportHub>,会导致消息发送到错误的 Hub 实例(或无有效实例)。

  • 排查:检查控制器构造函数的注入逻辑是否正确,示例如下:
    private readonly IHubContext<DangerReportHub> _hubContext;
    
    public YourController(IHubContext<DangerReportHub> hubContext)
    {
        _hubContext = hubContext;
    }
    
    同时确认 Program.cs/Startup.cs 中 MapHub<DangerReportHub>("/dangerReportHub") 的注册配置无误。

2. API 方法未进入消息发送分支

调用 ReportDanger 接口时,若 _dangerService.ReportDanger 返回的 danger.Data 为 false,会直接跳过 SignalR 消息发送逻辑,返回 BadRequest。

  • 排查:
    • 查看 API 调用的返回状态码,若为 400,说明走了错误分支,需检查 _dangerService.ReportDanger 的业务逻辑。
    • 在 API 方法中添加日志,确认 danger.Data 的值,以及是否执行到 await _hubContext.Clients.All.SendAsync(...) 代码行。

3. DangerSignalRDTO 序列化异常

SignalR 默认使用 System.Text.Json 序列化对象,若 DangerSignalRDTO 不符合序列化要求,会导致消息无法正常发送(或客户端无法解析)。

  • 排查:
    • 确保 DangerSignalRDTO 存在无参公共构造函数。
    • 确保所有需要传递的属性为公共可访问(public)。
    • 临时将 dangerSignalR 替换为简单字符串(如 await _hubContext.Clients.All.SendAsync("ReceiveDangerReport", "test")),测试是否能收到消息,以此排除序列化问题。

4. Cors 中间件位置错误

即便配置了 Cors 策略,若 app.UseCors("CorsPolicy") 位置不当,可能导致 API 调用的跨域处理异常,间接影响 SignalR 消息发送。

  • 排查:确保 UseCors 放在 UseRouting 之后、UseEndpoints 之前:
    app.UseRouting();
    app.UseCors("CorsPolicy");
    app.UseEndpoints(x =>
    {
        x.MapControllers();
        x.MapHub<DangerReportHub>("/dangerReportHub");
    });
    

5. Flutter 端 Hub 连接未持久化

_initHubConnection 中的 hubConnection 若为局部变量,方法执行完毕后会被 GC 回收,导致连接断开;或者连接已意外中断但未触发重连。

  • 排查:
    • 将 hubConnection 改为类成员变量,避免被回收:
      HubConnection? _hubConnection; // 类成员变量
      
      Future<void> _initHubConnection() async {
          const serverUrl = "http://*.*.*.*/dangerReportHub";
          _hubConnection = HubConnectionBuilder()
              .withUrl(serverUrl)
              .withAutomaticReconnect()
              .build();
          // 其他连接配置
      }
      
    • 添加连接状态监听,确认 API 调用时连接处于活跃状态:
      _hubConnection!.onclose(({Exception? error}) => print("连接关闭: ${error?.toString()}"));
      _hubConnection!.onreconnecting((Exception? error) => print("正在重连: ${error?.toString()}"));
      _hubConnection!.onreconnected((String? connectionId) => print("重连成功: $connectionId"));
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:25:34