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

启动SignalR Hub提示“未找到可用传输”,但协商返回三种可用传输

解决SignalR "No available transports found." 错误(ASP.NET Core 2.1 Preview2环境)

我之前在ASP.NET Core 2.1 Preview2版本中也碰到过一模一样的问题,结合你给出的协商返回结果,这里给你几个实用的排查和解决方向:

1. 严格匹配客户端与服务端的SignalR版本

ASP.NET Core 2.1 Preview2对应的SignalR客户端版本必须完全对齐,绝对不能混用不同版本的客户端包。如果你用的是npm包@aspnet/signalr,一定要安装1.0.0-preview2-final这个特定版本:

npm install @aspnet/signalr@1.0.0-preview2-final --save

版本不兼容是这个预览版里最常见的导致传输协商失败的原因。

2. 确认服务端传输配置无遗漏

虽然协商返回了可用传输列表,但服务端的中间件配置可能存在隐性问题。检查Startup.cs的Configure方法,确保SignalR路由在正确的位置配置,且没有手动禁用所需传输:

// Configure方法中确保SignalR中间件正确注册
app.UseSignalR(routes =>
{
    routes.MapHub<YourHub>("/yourHubEndpoint");
});

// 如果手动配置了SignalR选项,不要禁用默认传输
services.AddSignalR(options =>
{
    // 不要在这里添加禁用WebSockets、ServerSentEvents或LongPolling的配置
});

另外,注意CORS、认证这类中间件的顺序,确保SignalR的路由配置在这些中间件之后,避免请求被提前拦截。

3. 检查客户端初始化代码

有时候客户端代码会不小心限制了传输类型,或者没有正确加载所有传输实现。创建Hub连接时,尽量让客户端自动协商传输,不要手动限制:

import * as signalR from '@aspnet/signalr';

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/yourHubEndpoint")
    // 不要手动指定有限的传输列表,让框架自动匹配服务端返回的选项
    .build();

如果怀疑是浏览器环境限制(比如某些旧浏览器对WebSockets的支持问题),可以尝试强制指定LongPolling来测试是否能正常连接:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/yourHubEndpoint", {
        transport: signalR.HttpTransportType.LongPolling
    })
    .build();

4. 排查网络与代理干扰

如果应用部署在反向代理(比如Nginx、IIS)之后,需要确保代理支持WebSocket协议:

  • IIS环境下要开启WebSockets功能;
  • Nginx需要配置转发规则,确保Upgrade和Connection头被正确传递。

同时打开浏览器控制台的网络面板,查看协商请求之后的传输请求是否有404、500这类错误,这能帮你快速定位具体是哪个传输环节出了问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:57