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

ASP.NET Core 8添加SqlTableDependency后无法连接HTTPS服务器求助

问题排查与解决方案

核心问题:错误的Hub注入方式

你直接将AppHub注册为单例服务是SignalR的典型错误用法。SignalR的Hub实例是每个连接独立创建的,不能通过AddSingleton注入到其他服务中,这会导致Hub实例缺少正确的上下文(比如Clients对象未初始化),进而在启动时引发异常,表现为无法连接到HTTPS服务器。

修复步骤

1. 移除错误的Hub单例注册

删除Program.cs中的这行代码:

builder.Services.AddSingleton<AppHub>();

SignalR会自动管理Hub的生命周期,无需手动注册为单例。

2. 使用IHubContext替代直接注入Hub

修改ExpenseDependency,通过IHubContext<AppHub>实现跨服务调用SignalR客户端方法,这是SignalR的标准用法:

private readonly SqlTableDependency<ResultExpenseDto> _tableDependency;
private readonly IHubContext<AppHub> _hubContext;
private readonly IExpenseService _expenseService;

public ExpenseDependency(IHubContext<AppHub> hubContext, IExpenseService expenseService)
{
    string connectionString = "Data Source=ADAPC\\SQLEXPRESS;Initial Catalog=DB_WPMS;Integrated Security=True;TrustServerCertificate=True;";
    _hubContext = hubContext;
    _expenseService = expenseService;
    _tableDependency = new SqlTableDependency<ResultExpenseDto>(connectionString);
    _tableDependency.OnChanged += _tableDependency_OnChanged;
    _tableDependency.OnError += _tableDependency_OnError;
}

private void _tableDependency_OnChanged(object sender, TableDependency.SqlClient.Base.EventArgs.RecordChangedEventArgs<ResultExpenseDto> e)
{
    if (e.ChangeType != TableDependency.SqlClient.Base.Enums.ChangeType.None)
    {
        var value = _expenseService.itemListExpense();
        _hubContext.Clients.All.SendAsync("ReceiveExpense", value);
    }
}

3. 完善错误处理逻辑

实现_tableDependency_OnError方法,避免未处理异常导致应用崩溃:

private void _tableDependency_OnError(object sender, TableDependency.SqlClient.Base.EventArgs.ErrorEventArgs e)
{
    // 记录错误日志(可注入ILogger实现)
    // _logger.LogError(e.Error, "SqlTableDependency 触发错误");
}

4. 检查数据库权限

确保运行应用的账户对目标数据库拥有以下权限:

  • CREATE QUEUE
  • CREATE SERVICE
  • CREATE PROCEDURE
  • SUBSCRIBE QUERY NOTIFICATIONS
  • VIEW DEFINITION
  • SELECT

5. 新增资源释放逻辑

为ExpenseDependency实现IDisposable接口,避免应用关闭时资源泄漏:

public void Dispose()
{
    _tableDependency?.Stop();
    _tableDependency?.Dispose();
}

额外验证点

  • 确认ResultExpenseDto的属性与数据库表字段名称完全匹配(或通过特性指定映射关系)
  • 确保IExpenseService已在Program.cs中正确注册(比如AddScoped<IExpenseService, ExpenseService>())

内容的提问来源于stack exchange,提问作者Gökmen Ada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:50:00