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

时间:2016-08-26 09:39:29

标签: javascript c# asp.net jquery-ui signalr

我正在尝试创建一个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 () {
        });
}

这些方法在' _create()'像这样在JQuery小部件中运行:

_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相对应的有效连接。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

通过阅读post找到解决方案。显然在Owin启动类中设置了自定义SignalR依赖解析器设置会破坏javascript回调。将依赖项解析器设置代码移动到Global.asax中的Application_Start可以解决问题。为什么这种情况真的发生在我身上......

Startup.cs中的错误DI设置

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());
}