ASP.NET Core 5中KendoUI Grid对应的SignalR Hub一直pending如何解决?
故障根因及修复方案
1. Hub异步方法无等待导致初始化异常
你当前NewswireHub等所有Hub类中的OnConnectedAsync、OnDisconnectedAsync方法对组操作的调用未加await,属于“发完就忘”的异步调用,本地环境网络延迟极低时不会出问题,部署到Azure后跨服务网络耗时升高,会导致连接初始化逻辑未完成就被中断,直接触发连接异常。
修复代码如下:
public override async Task OnConnectedAsync() { await Groups.AddToGroupAsync(Context.ConnectionId, GetGroupName()); await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception e) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, GetGroupName()); await base.OnDisconnectedAsync(e); }
2. 并行启动多Hub触发浏览器并发请求限制
浏览器对同域名的并发HTTP请求默认限制为6个,你使用的长轮询传输模式下,每个SignalR连接会长期占用一个请求槽,4个连接并行启动时,大量请求同时发出会超出限制,超出的请求就会进入pending队列,出现你观察到的preflight、无返回的现象。
改成串行启动Hub即可解决,修改hubs.js代码:
// 移除原有4个并行start的代码,替换为串行初始化逻辑 async function initAllHubs() { await newswire_hub.start({ json: true }); await fixture_hub.start({ json: true }); await requirement_hub.start({ json: true }); await position_hub.start({ json: true }); } const allHubsReady = initAllHubs();
然后修改所有Kendo Grid的SignalR配置,把promise字段统一改成allHubsReady:
transport: { signalr: { promise: allHubsReady, // 替换原来的单个hub启动promise // 其余配置保留不变 } }
3. 缺失CORS配置导致预检请求被拦截
你提供的配置中没有CORS相关设置,Azure Web App默认会拦截跨域OPTIONS预检请求,直接导致SignalR连接无法建立,需要在Startup.cs中补充配置:
public void ConfigureServices(IServiceCollection services) { // 新增CORS配置,放在AddSignalR之前 services.AddCors(options => { options.AddPolicy("SignalRCors", policy => { // 替换为你Azure Web App的实际访问域名 policy.WithOrigins("https://你的应用域名") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); // 你原有的AddSignalR代码保留不变 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); // 新增CORS中间件调用,放在UseAzureSignalR之前 app.UseCors("SignalRCors"); // 你原有的UseAzureSignalR代码保留不变 }
4. 配置&服务层检查
- 检查你
appsettings.json中SignalR连接字符串的Endpoint部分,你贴出的示例里有多余空格:https://mycompany- signalr.service.signalr.net,实际配置中有空格的话要删除。 - 如果你使用的是免费层Azure SignalR服务,可以在Azure门户查看服务的限流指标,免费层并发连接限制为20,多用户访问时可能触发限流,可升配到标准层解决。
内容的提问来源于stack exchange,提问作者Yanayaya
相关产品推荐
相关产品推荐

