信号器不调用客户端功能

时间:2015-02-20 15:18:17

标签: jquery asp.net signalr signalr-hub

我意识到这个问题已被问到several times,但其他人发布的解决方案不是我的解决方案。所以,我希望这个问题的另一个答案可以解决这个问题。

在服务器上对此进行调试时,它会找到相应的客户端并调用“addAlert”方法。此Javascript初始化正常,“Alert Ready”消息将写入控制台。

服务器和客户端代码都没有错误消息:

$(function () {

    // enable logging for debugging
    $.connection.hub.logging = true;

    // Declare a proxy to reference the hub. 
    var hub = $.connection.alertHub;

    hub.client.addAlert = function (id, title, url, dateTime) {
        console.log(title);
    };

    $.connection.hub.start().done(function () {
        console.log("Alert Ready");
    });
});
  

[GMT-0600 09:12:51(中美洲标准时间)] SignalR:客户   订阅了'alerthub'枢纽。 jquery.signalR-2.0.0.min.js:8 [09:12:51   GMT-0600(中美洲标准时间)] SignalR:与...谈判   '/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22alerthub%22%7D%5D&clientProtocol=1.3'。   jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600(中美洲)   标准时间)] SignalR:连接到websocket端点   '?WS://mysite.local/signalr/connect运输=&的WebSockets放大器; connectionToken = C ... OZxqiRQKOc%3D&安培; connectionData =%5B%7B%22name%22%3A%22alerthub%22%7D%5D&安培; TID = 4' 。   jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600(中美洲)   标准时间)] SignalR:Websocket打开。   jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600(中美洲)   标准时间)] SignalR:现在监控保持活动并发出警告   超时13333.333333333332,连接丢失超时20000。

即使在从服务器调用客户端函数之后,上述日志也会发生:

string dateTime;
foreach(var connection in ConnectionMapping<Guid>.GetConnections(userId))
{
    dateTime = SystemTime.Now().ToString();
    _alertHubContext.Clients.Client(connection).addAlert(alert.Id.Shrink(), title, url, dateTime);
}

其他解决方案都描述了开发人员在连接客户端方法之前调用start()的情况。但是,我不这样做。

当服务器方法调用客户端方法时,控制台根本不会更改。

我相信我已将其缩小到这个范围:

Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<AlertHub>().Clients.All.hi();

我创建了一个名为hi()的基本客户端方法,它只会弹出警报。这甚至不起作用。

使用GetHubContext方法调用客户端方法时,似乎没有与客户端代码建立连接。

1 个答案:

答案 0 :(得分:1)

事实证明,我的客户端函数没有被调用,因为我使用的是自定义依赖项解析器。显然,如果在DependencyResolver类中设置OwinStartup,它会以某种方式阻止调用客户端方法。

因此,moving it到Global.asax,或者更具体地说是Application_Start事件,解决了这个问题:

protected void Application_Start()
{
    GlobalHost.DependencyResolver = new SignalrDefaultDependencyResolver(UnityConfig.Container);
}