在JQuery UI小部件中不会触发SignalR回调

本文关键字:SignalR 回调 JQuery UI 小部 | 更新日期: 2023-09-27 18:04:01

我正在尝试创建一个JQuery UI小部件,使用SignalR(2.2.0)从服务器接收实时更新。在服务器上调用方法工作得很好,但是从服务器调用客户端回调不会在客户端上触发。

我已经像这里建议的那样在客户端上启用了日志记录:SignalR Troubleshooting,我可以在控制台中看到连接设置得很好,但从未调用客户端方法。没有任何类型的错误信息。在开始连接之前,我还在集线器代理上定义了客户机方法,如下所示:

_bindClientCallbacks: function () {
    theHub.client.broadCastToClient = function (message) {
        twr.log(message);
    };
}

,然后像这样启动集线器连接:

_startSignalRClient: function () {
    $.connection.hub.logging = true;
    $.connection.hub.start()
        .done(function () {
            twr.log("Connected to SignalR hub, id=" + $.connection.hub.id);
        })
        .fail(function () {
        });
}

这些方法在JQuery小部件的'_create()'函数中调用,如下所示:

_create: function () {
    theHub = $.connection.DataImportHub;
    this._bindClientCallbacks();
    this._startSignalRClient();
} 

这工作得很好,我可以得到一个有效的连接与id。我还可以从客户机调用服务器方法。但是,当我试图从服务器调用客户端上的broadCastToClient方法时,如下所示:

public void BroadCastToClient(string userId, string message)
{
    var hubContext = GlobalHost.ConnectionManager.GetHubContext<DataImportHub>();
    foreach (var connectionId in _connections.GetConnections(userId))
    {
        hubContext.Clients.Client(connectionId).broadCastToClient(message);
    }
}

客户端什么也没发生。即使服务器确实找到了一个与我在客户端上获得的连接id相对应的有效连接。

我在这里错过了什么?

在JQuery UI小部件中不会触发SignalR回调

刚刚通过阅读这篇文章找到了解决方案。显然,在Owin启动类中设置自定义SignalR依赖解析器会破坏javascript回调。将依赖解析器设置代码移动到全局中的Application_Start。Asax做到了。我真的不明白为什么会发生这种事…

app.Map("/signalr", map =>
{
    var hubConfiguration = new HubConfiguration
    {
        Resolver = new NinjectSignalRDependencyResolver(new StandardKernel())
    };
    map.RunSignalR(hubConfiguration);
});

Global.asax中DI设置良好

protected void Application_Start()
{
    GlobalHost.DependencyResolver = new NinjectSignalRDependencyResolver(new StandardKernel());
}