SignalR客户端方法未调用
本文关键字:调用 方法 客户端 SignalR | 更新日期: 2023-09-27 18:18:08
我还在学习SignalR。在asp.net web Api我创建了一个简单的集线器。在angular中,我已经创建了一个工厂来实例化与hub的连接。
public class NotificationHub : Hub
{
public void Hello()
{
var x = "test";
Clients.All.hello(x);
}
}
客户端。
.factory("NotificationHub", function(){
var NotificationHubFactory = {};
NotificationHubFactory.proxy = null;
var initialize = function(){
$.connection.hub.url = "http://localhost:18678/signalr";
$.connection.hub.start().done(function(response){
NotificationHubFactory.proxy = $.connection.notificationHub;
}).fail(function(error){
console.log(error);
});
};
initialize();
return NotificationHubFactory;
});
问题是当我尝试这样做的时候。
NotificationHub.proxy.server.hello();
NotificationHub.proxy.client.hello = function(data){
console.log(data);
};
NotificationHub.proxy.client.hello
永远不会被调用。虽然如果我在集线器Clients.All.hello(x);
中设置了一个断点,它会触发,这意味着它无法在客户端找到hello
方法。
你知道是什么问题吗?
在调用hub.start()
之前,您需要将至少一个事件处理程序附加到集线器。否则,客户端永远不会注册到集线器。在这里查看文档中的注释…
通常在调用start方法之前注册事件处理程序建立连接。如果你想注册一些事件处理程序,您可以这样做,但是您必须注册至少一个事件处理程序,然后才能调用start方法。这样做的一个原因是,在一个对象中可以有许多hub应用程序,但您不希望触发OnConnected事件每个集线器,如果你只使用其中一个。当连接建立后,Hub上存在客户端方法proxy告诉SignalR触发OnConnected事件。如果你在调用start方法之前不要注册任何事件处理程序将能够调用Hub上的方法,但是Hub的OnConnected方法将不会调用任何客户端方法服务器。
试试这个…
.factory("NotificationHub", function(){
var NotificationHubFactory = {};
NotificationHubFactory.proxy = null;
var initialize = function(){
$.connection.hub.url = "http://localhost:18678/signalr";
$.connection.notificationHub.client.hello = function () {};
$.connection.hub.start().done(function(response){
NotificationHubFactory.proxy = $.connection.notificationHub;
}).fail(function(error){
console.log(error);
});
};
initialize();
return NotificationHubFactory;
});
然后在调用服务器之前替换hello
处理程序…
NotificationHub.proxy.client.hello = function(data){
console.log(data);
};
NotificationHub.proxy.server.hello();
这段代码还有一个潜在的问题,因为hub.start()
是异步的,调用可能在集线器准备好之前发生。