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

Xamarin客户端连接SignalR服务端始终处于Connecting状态如何解决

问题修复方案

1. 修复异步调用逻辑(核心问题)

你当前的Connect方法为同步实现,调用hubConnection.StartAsync()后未等待异步操作完成,同时写的死循环直接占满了当前线程的执行资源,导致SignalR内部的连接逻辑无法被调度执行,所以会一直卡在Connecting状态。
将Connect方法改为异步实现,如下:

public async Task Connect()
{
    try
    {
        // 等待连接操作完成
        await hubConnection.StartAsync();
        // 此处连接已完成,可获取正确状态
        var currentState = hubConnection.State;
    }
    catch (Exception ex)
    {
        // 此处可捕获连接异常,排查具体错误原因(证书、网络、地址错误等都可以在这里拿到报错信息)
        Console.WriteLine($"连接失败:{ex.Message}");
    }
}

调用Connect方法时也需要使用await关键字,禁止使用.Result、.Wait()等同步阻塞写法,避免线程死锁。

2. 检查Xamarin端网络权限

  • Android端:确认AndroidManifest.xml中已添加INTERNET权限;若使用Android 9及以上版本且测试地址为HTTP协议,需要在application节点添加android:usesCleartextTraffic="true"配置,允许明文流量请求。
  • iOS端:若测试地址为HTTP协议,需要配置ATS(应用传输安全)例外,放开对应IP的访问限制。

3. 确认服务端监听配置

检查服务端是否绑定了公网/局域网可访问的地址,而非仅绑定localhost:可在服务端启动配置中添加监听地址,示例如下:

webBuilder.UseUrls("https://0.0.0.0:5001", "http://0.0.0.0:5000");

你直接访问Hub地址返回Connection ID required属于正常现象,SignalR Hub端点不支持浏览器直接GET访问,需要走SignalR协议握手流程,该返回不代表服务端异常。

4. 可选:指定传输协议

如果仍无法连接,可在客户端配置时指定传输协议,排除协议兼容问题:

.WithUrl("https://ip:5001/notifier", options => {
    // 强制使用WebSocket传输
    options.Transports = HttpTransportType.WebSockets;
    options.HttpMessageHandlerFactory = factory => new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
    };
})

内容的提问来源于stack exchange,提问作者Morek Povýšil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:03