Azure SignalR Hub WebSocket握手出现NullReferenceException如何排查
注意:你看到的Azure SignalR返回的空引用错误,本质是你的Hub服务器在处理Azure SignalR回调的连接请求时抛出的异常,被Azure SignalR服务透传给了客户端,并不是Azure SignalR本身的服务故障。你本地Hub没有日志大概率是日志级别不够,没有捕获到Debug级别的错误。
排查步骤
1. 开启全链路详细日志
- 服务端(.NET Hub程序)修改
appsettings.json,将SignalR相关日志级别调整为Debug,捕获完整的异常栈:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.SignalR": "Debug", "Microsoft.Azure.SignalR": "Debug", "Microsoft.AspNetCore.Http.Connections": "Debug", "System": "Warning", "Microsoft": "Warning" } } }
- 客户端开启Debug日志,JS客户端初始化时添加
configureLogging(signalR.LogLevel.Debug),.NET客户端初始化时添加ConfigureLogging(logging => logging.AddConsole().SetMinimumLevel(LogLevel.Debug)),获取握手阶段的全量交互信息。
2. 对比当前Hub与历史正常Hub的差异
因为你之前用相同的Hub服务器、相同的Azure SignalR资源跑过正常的聊天Hub,问题大概率出在当前新增Hub的自定义逻辑上:
- 检查当前Hub的
OnConnectedAsync、OnDisconnectedAsync方法,有没有未判空直接访问的对象,比如直接调用Context.GetHttpContext()后直接访问其属性,走Azure SignalR路由时HttpContext的部分属性和本地直连的结构不同,很容易触发空引用。 - 检查Hub构造函数注入的所有服务,确认所有依赖都已在DI容器中注册,如果你用到了
IHttpContextAccessor,确认你已经在Program.cs中添加了builder.Services.AddHttpContextAccessor()注册,且访问时加了空判断。 - 确认当前Hub的路由配置正确,
app.MapHub<你的Hub类>("/hub路由")的路由路径和客户端请求的路径完全一致,没有拼写错误。
3. 检查Azure SignalR资源配置
- 确认本地Hub程序使用的Azure SignalR连接字符串正确,没有混用其他资源的密钥。
- 检查Azure SignalR服务的运行模式为服务器模式,如果设置为无服务器模式会导致握手异常。
- 检查Azure SignalR的防火墙配置,你的本地Hub服务器的出口IP已经被添加到允许列表,避免Hub无法和Azure SignalR服务建立通信。
- 确认当前使用的
Microsoft.Azure.SignalRNuGet包版本和之前正常运行时的版本一致,可尝试升级到最新稳定版规避已知bug。
4. 最小场景验证
你可以新增一个无任何自定义逻辑的空Hub,测试是否能正常连接:
public class TestEmptyHub : Hub { public override async Task OnConnectedAsync() { await base.OnConnectedAsync(); } }
如果空Hub可以正常握手连接,说明是原Hub的自定义逻辑存在空引用,逐行注释排查即可。如果空Hub也报相同错误,尝试在Azure门户重启SignalR资源后再测试。
内容的提问来源于stack exchange,提问作者mdarwin
相关产品推荐
相关产品推荐

