为什么Azure SignalR服务未向我的KendoUI Grid返回任何数据?
1. 核心配置错误:Hub映射位置和写法错误
ASP.NET Core 3.0+ 版本中,Azure SignalR 的 Hub 映射必须放在 UseEndpoints 委托内部,你当前单独调用 app.UseAzureSignalR 且放在 UseEndpoints 之后的写法已经废弃,会导致 Hub 路由无法正常注册。
修正方案:
删除 Configure 方法中单独的 app.UseAzureSignalR 代码块,将 Hub 映射移到 UseEndpoints 中:
app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/healthcheck"); endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); // 所有Hub映射写在这里 endpoints.MapHub<RequirementHub>("/requirementHub"); endpoints.MapHub<PositionHub>("/positionHub"); endpoints.MapHub<FixtureHub>("/fixtureHub"); endpoints.MapHub<NewswireHub>("/newswireHub"); });
2. Hub异步方法未加await
你在 OnConnectedAsync、OnDisconnectedAsync 中调用的分组操作是异步方法,没有加await会导致操作未完成就提前返回,用户无法被正确加入分组,后续数据推送无法触达。
修正方案:
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); }
3. 前端选择器拼写错误
HTML 中 Grid 容器的 ID 是 requirement-grid(中划线),JS 中选择器写的是 $('#requirement_grid')(下划线),会导致 Grid 无法正常绑定到对应容器。
修正方案:
将 JS 选择器改为 $('#requirement-grid'),其余三个 Grid 同步检查 ID 拼写。
4. Hub Read 方法返回格式不符合 Kendo 要求
Kendo SignalR 数据源默认要求返回带Data(数据列表)和Total(总条数)的结构,你直接返回IEnumerable且没有处理分页、排序参数,会导致 Grid 无法识别返回的数据。
修正方案:
引入 Kendo 的DataSourceRequest相关命名空间,修改 Read 方法:
using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; public object Read([DataSourceRequest] DataSourceRequest request) { return _requirement.GetAll().ToDataSourceResult(request); }
5. 分组策略不合理
你使用RemoteIpAddress作为分组名称,部署在 Azure 后,服务端拿到的是 Azure 反向代理的内网IP,不是用户真实IP,会导致分组逻辑混乱。
修正方案:
改用登录用户ID作为分组依据,更稳定可靠:
public string GetGroupName() { return Context.UserIdentifier; }
6. 额外检查项
- 确认 Azure SignalR 服务的服务模式设置为
Default,不要使用Serverless模式 - 确认你的账号处于登录状态,全局配置的身份验证过滤器不会拦截 SignalR 请求
- 打开浏览器控制台的网络标签,检查 SignalR 连接建立后的
read调用是否有报错返回
内容的提问来源于stack exchange,提问作者Yanayaya

