2

我正在尝试使用 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();
});

我有一些部分代码,由使用 ajax 的 jquery 选项卡加载:

_centralHub.dataChangeNotification = function (data) {
    alert(data[0] + "::" + data[1] + "::" + data[2]);
    if (data[0] == 'User') {
        grid.refresh();
    }
};

现在在数据层,当发生一些粗略的操作时,我调用 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。

鉴于我们没有可用的网络套接字,长轮询对于我们的用户/基础设施可能不是一个好主意。或许有一天...

4

1 回答 1

0

每次解析集线器时都会创建一个新实例,因此您不能像这样持久化状态。

您可以从 this.Clients 获取集线器中的所有客户端。

要从集线器类外部广播,请使用:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<DataMessageService>();
clients.dataChangeNotification(new string[] {entityName, changeType, id});
于 2012-04-04T01:42:32.867 回答