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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:27:02