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

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.SignalR NuGet包版本和之前正常运行时的版本一致,可尝试升级到最新稳定版规避已知bug。

4. 最小场景验证

你可以新增一个无任何自定义逻辑的空Hub,测试是否能正常连接:

public class TestEmptyHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }
}

如果空Hub可以正常握手连接,说明是原Hub的自定义逻辑存在空引用,逐行注释排查即可。如果空Hub也报相同错误,尝试在Azure门户重启SignalR资源后再测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:05