SignalR Client Hub上的On事件不会被调用

时间:2013-04-17 15:51:17

标签: signalr signalr-hub

我似乎遇到了SignalR的JS Client Hub问题。

问题是'on'处理程序似乎不起作用 - 它不会产生错误,但不会接收服务器发送的任何信号。 下面的代码显示了一个提取,我调用服务器(使用调用)工作正常 - 然后在服务器上我回调acceptHubData应该在客户端上接收但不是。

我的目标是当导航到页面时,每个页面将打开与特定集线器的连接,并在用户移动到另一个页面时释放此连接!!

编辑:使用以下代码段有效,但我想知道为什么下面使用'on'事件的代码不起作用!

    var superHub = $.connection.mySuperHub;

    superHub.client.acceptHubData = function (data) {
        $('<li>hello there' + data + '</li>').prependTo($('#ul1'))
    }

    $.connection.hub.start().done(function () {
        $('<li>done phase 1</li>').prependTo($('#ul1'))
    });

非常感谢任何帮助!

这是客户端代码(以js为单位)

$(document).ready(function () {

    var myHub;

    try {

        var connection = $.hubConnection();

        connection.start().done(function () {

            myHub = connection.createHubProxy("mySuperHub");

            myHub.on('acceptHubData', function (data) {
                alert(data);   // THIS IS NOT CALLED!
            });

            myHub.invoke('AcceptSignal', "hello from the client2");

        });

    }
    catch (e) {
        alert(e.message);
    }
});

这是服务器代码:

[HubName("mySuperHub")]
public class MyHub : Hub
{

    private readonly HubEngine _hubEngine;

    public MyHub() : this(HubEngine.Instance) { }

    public MyHub(HubEngine hubEngine)
    {
        _hubEngine = hubEngine;
    }

    public void AcceptSignal(string msg)
    {
        Clients.Caller.acceptHubData("hi");
        Clients.All.acceptHubData("hi");
    }

}

2 个答案:

答案 0 :(得分:43)

您仍然可以使用on方法在最新版本的SignalR中为JS客户端中心方法调用添加事件,但如果在调用{{hubProxy之前未向hubConnection.start()添加任何事件侦听器1}},您将不会订阅该中心。 SignalR订阅了hubConnection启动时您拥有事件处理程序的集线器。如果您未订阅集线器,则在start()之后将任何事件添加到该集线器将无效。

如果在start()之前向集线器添加至少一个事件侦听器,即使它没有执行任何操作,也可以在启动后使用on将所需的任何其他事件处理程序添加到集线器( )和你的处理程序将被调用。

如果您在致电hubProxy.on('eventName', function (...之前使用autogeneratedHubProxy.client.eventName = function (...start()添加活动并不重要,但只有on会在{{1}之后成功添加事件监听器调用。

答案 1 :(得分:1)

不确定您使用的是哪个版本的SignalR,但我在服务器上使用以下语法取得了更大的成功:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    

和我的客户:

myHub.client.acceptHubData = function (data) {
    console.log(data);
}