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

ASP.NET MVC 借助SignalR推送API数据时Datatable不更新及连接断开问题求助

问题1:Datatable数据无法实时变更

问题原因

  • 推送触发逻辑错误:当前仅当GetAllTransaction查询接口被调用时才会发送refreshTransactions通知,后台交易数据实际发生新增/修改/删除时,没有主动触发SignalR推送,前端收不到更新指令。
  • Datatable刷新逻辑错误:每次调用loadData都重复初始化Datatable实例,既不会刷新已有实例数据,还会引发重复初始化报错。

修复方案

  1. 后台业务逻辑调整:找到交易数据发生变更的对应方法(新增、修改、删除交易的业务代码),主动调用推送代码,移除GetAllTransaction查询方法里的推送逻辑:
// 仅在交易数据发生变更时调用,不要放在查询接口里
await _context.Clients.All.SendAsync("refreshTransactions");
  1. 前端JS代码调整:Datatable仅初始化一次,收到推送通知时调用ajax.reload方法刷新数据:
$(() => {
    let connection = new signalR.HubConnectionBuilder()
        .withUrl("/transactionhub")
        .withAutomaticReconnect() // 同步添加自动重连配置,修复第二个问题
        .build();
    let dataTable = null;

    // 连接错误日志输出,方便排查问题
    connection.onclose(error => {
        console.error("SignalR连接断开,错误信息:", error);
    });

    connection.start().then(() => {
        console.log("SignalR连接成功");
    }).catch(error => {
        console.error("SignalR连接失败:", error);
    });

    connection.on("refreshTransactions", function () {
        if(dataTable){
            dataTable.ajax.reload(); // 仅刷新数据,不重新初始化表格
        }
    })

    loadData();

    function loadData() {
        dataTable = $('#transactionList').DataTable({
            "pagingType": "simple",
            "autoWidth": true,
            "destroy": true, // 允许销毁已有实例,避免重复初始化报错
            "ajax": {
                "url": "/GetAllTransaction",
                "type": "GET",
                "datatype": "json",
            },
            "columns": [
                { "data": "email", "autoWidth": true, "searchable": true },
                { "data": "stationName", "autoWidth": true, "searchable": true },
            ],
        });
    }
})

问题2:SignalR连接成功后立即断开

问题原因

  • 默认未开启自动重连,网络波动、服务端心跳超时都会直接断开连接。
  • 前后端SignalR版本不匹配:如果后端是ASP.NET Core SignalR,前端用了旧版jquery.signalR包会出现兼容问题导致断开。
  • 缺少CORS配置:如果你的前端站点和服务端域名/端口不一致,没有配置允许Credentials的跨域规则,会导致连接建立后被浏览器拦截断开。

修复方案

  1. 前端连接代码已在上面的修复中添加自动重连和错误日志配置,先打开控制台查看断开的具体错误信息。
  2. 确保前后端SignalR版本一致:后端是ASP.NET Core 3.1/5/6/7对应版本,前端必须使用@microsoft/signalr的对应大版本,不要使用旧的jquery.signalR包。
  3. 跨域场景下Startup配置调整:
// ConfigureServices里添加
services.AddCors(options =>
{
    options.AddPolicy("SignalRCors", policy =>
    {
        policy.WithOrigins("替换为你的前端站点地址,如http://localhost:8080")
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials();
    });
});

// Configure里要把CORS中间件放在SignalR和路由中间件之间
app.UseRouting();
app.UseCors("SignalRCors"); 
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<TransactionHub>("/transactionhub").RequireCors("SignalRCors");
    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

内容的提问来源于stack exchange,提问作者ahmad taufiq hidayat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:39:03