我正在尝试使用SignalR创建一个服务器到客户端广播机制,它似乎什么也没做。
我有一个像这样的中心:
public class DataMessageService : Hub, IClientNotificationService
{
dynamic _clients;
public DataMessageService(IConnectionManager connectionManager)
{
_clients = connectionManager.GetClients<DataMessageService>();
}
public void SendDataChangeNotification(string entityName, string changeType, string id)
{
_clients.dataChangeNotification(new string[] {entityName, changeType, id});
}
}
我的_Layouts.cshtml有这个:
var _centralHub;
$(function() {
// startup the signalr hub and get the proxies we need
_centralHub = $.connection.dataMessageService;
$.connection.hub.start();
});
我有一些部分代码,由jquery选项卡使用ajax加载:
_centralHub.dataChangeNotification = function (data) {
alert(data[0] + "::" + data[1] + "::" + data[2]);
if (data[0] == 'User') {
grid.refresh();
}
};
现在在数据层中,当发生一些crud操作时,我调用了DataMessageService.SendDataChangeNotification,但在客户端没有任何反应。
我错过了什么吗?
更新:我认为它可能与vs web服务器有关,但在使用完整的IIS(在Win 7上)时也会失败。
另一个更新: 我的服务与我的中心混淆了。我现在将它们分开,所以它看起来如下,但它仍然不起作用。
public class DataMessageService : IClientNotificationService
{
public void SendDataChangeNotification(string entityName, string changeType, string id)
{
IConnectionManager icm = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = icm.GetClients<DataMessageHub>();
clients.dataChangeNotification(new string[] { entityName, changeType, id });
}
}
public class DataMessageHub : Hub
{
}
:(
更多信息:
这适用于FireFox,但不适用于IE或Chrome。
我还试图创建一个简单的示例应用程序,这适用于Chrome和IE。
鉴于我们没有可用的网络套接字,长时间轮询对我们的用户/基础设施可能不是一个好主意。也许有一天......
答案 0 :(得分:0)
每次解析时都会创建一个新的集线器实例,因此您无法像这样保持状态。
您可以从此客户端获取集线器中的所有客户端。
要从集线器类外部广播,请使用:
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<DataMessageService>();
clients.dataChangeNotification(new string[] {entityName, changeType, id});