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();
    }
};

データ レイヤーで、いくつかの 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 で問題なく動作しました。

利用可能な Web ソケットがないことを考えると、長いポーリングはユーザー/インフラストラクチャにとって良い考えではないかもしれません。いつの日にか...

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 に答える