17

我似乎对 SignalR 的 JS 客户端中心有疑问。

问题是“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");
    }

}
4

2 回答 2

47

在最新版本的 SignalR 中,您仍然可以使用该方法为 JS 客户端 hub 方法调用添加事件,但如果在调用之前on不添加任何事件侦听器,您将不会订阅 hub。SignalR 在启动时订阅您拥有事件处理程序的集线器。如果您没有订阅您的集线器,那么在 start() 之后向该集线器添加任何事件都将不起作用。hubProxyhubConnection.start()hubConnection

如果您在 start() 之前将至少一个事件侦听器添加到集线器,即使它不执行任何操作,您也可以on在 start() 之后使用您想要的任何其他事件处理程序添加到集线器,并且您的处理程序将被调用。

hubProxy.on('eventName', function (...使用或autogeneratedHubProxy.client.eventName = function (...在调用之前添加事件并不重要start(),但只会在调用on之后成功添加事件侦听start()器。

于 2013-04-17T19:14:44.550 回答
1

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

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

在我的客户身上:

myHub.client.acceptHubData = function (data) {
    console.log(data);
}
于 2013-04-17T15:58:55.480 回答