在我的MVC 5应用程序中,我正在页面加载时在客户端上建立Signal R连接,这可以按预期工作。
稍后,我想添加一个额外的处理程序并进行服务器端调用,我可以看到服务器接收到此调用,然后启动了一些客户端调用,客户端上的处理程序不会被调用。 / p>
页面加载时建立连接
function initialiseRealTimeDataRetrieval() {
var hub = $.connection.autoGeneratedProxyForHub;
hub.client.recieveRealTimeData = function (data) {
//Do Stuff
};
$.connection.hub.start().done(function () {
hub.server.getRealTimeData();
});
}
稍后再打
function initialiseFeed () {
var hub = $.connection.autoGeneratedProxyForHub;
hub.client.recieveRealTimeDataFeed = function (data) {
//Do stuff
};
if ($.connection.hub.state == $.connection.connectionState.connected) {
hub.server.getRealTimeDataFeed();
}
else {
$.connection.hub.start().done(function () {
hub.server.getRealTimeDataFeed();
});
}
}
到目前为止,我已经尝试了以下方法:
以下对于其他调用可以正常工作,但是使页面加载时连接的所有工作都变得多余:
function initialiseFeed () {
var hub = $.connection.autoGeneratedProxyForHub;
hub.client.recieveRealTimeDataFeed = function (data) {
//Do stuff
};
$.connection.hub.stop();
$.connection.hub.start().done(function () {
hub.server.getRealTimeDataFeed();
});
}
通过调试器检查集线器对象确实表明所有客户端都已连接,包括其他客户端。
答案 0 :(得分:0)
根据Signal R JS API Docs,针对集线器自动生成的代理不能用于注册多个事件处理程序:
何时使用生成的代理
如果要为一个客户端方法注册多个事件处理程序 服务器调用,您将无法使用生成的代理。除此以外, 您可以根据编码选择是否使用生成的代理 偏爱。如果您选择不使用它,则不必参考 客户代码中脚本元素中的“ signalr / hubs” URL。
要为现有连接注册新的处理程序,在建立连接之前,该连接必须至少具有一个与之关联的处理程序,注册新的处理程序后,您必须调用start()
:
注意
通常,您在调用start方法之前注册事件处理程序 建立连接。如果您想注册一些活动 处理程序建立连接后,您可以执行此操作,但是您 必须至少注册一个事件处理程序,然后才能调用 启动方法。原因之一是,一个 应用程序,但您不想在以下位置触发OnConnected事件 每个集线器(如果您只打算使用其中一个)。当。。。的时候 建立连接后,集线器的客户端方法的存在 代理告诉SignalR触发OnConnected事件。如果你 在调用start方法之前不要注册任何事件处理程序, 将能够调用集线器上的方法,但是集线器的OnConnected 方法不会被调用,并且不会从调用任何客户端方法 服务器。