我正在尝试创建一个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相对应的有效连接。
我在这里缺少什么?
答案 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());
}