我还在学习SignalR。在asp.net web Api中,我创建了一个简单的集线器。而且我已经创建了一个工厂来实例化与集线器的连接。
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
方法。
任何想法是什么问题?
答案 0 :(得分:1)
在调用hub.start()
之前,您需要将至少一个事件处理程序附加到集线器。没有它,客户端永远不会注册到集线器。请参阅documentation here ...
通常在调用start方法之前注册事件处理程序 建立连接。如果你想注册一些活动 建立连接后的处理程序,你可以这样做,但你 必须在调用之前注册至少一个事件处理程序 启动方法。其中一个原因是一个中心可能有很多 应用程序,但您不希望触发OnConnected事件 如果您只使用其中一个,那么每个Hub。当。。。的时候 建立连接,在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()
是异步的,并且调用可能在集线器准备好之前发生。