2012-09-15 4 views
12

コントローラからSignalRハブのメソッドを呼び出す良い方法はありますか?SignalRの現在のハブを取得する

StatsHub.Instance.SendMessage("blah"); 

例えば、

public class StatsHub : Hub 
{ 
    private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub()); 
    public static StatsHub Instance { get { return instance.Value; } } 

    public StatsHub() 
    { 
     if (this.Clients == null) 
     { 
      var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>(); 
      this.Clients = hubContext.Clients; 
      this.Groups = hubContext.Groups; 
     } 
    } 

    // methods here... 
} 

ので、私のコントローラのアクションで私は言うことができるとそのhubContextが発信者かを持っていないことを除いては、ほとんど良いことだ:

は、今のところ私はこれを持っていますハブのコンテキストプロパティ - 持っているといいです。

うまくいけば、これを行うより良い方法がありますか?

答えて

14

私が必要とするDefaultHubManagerが見つかりました。

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver); 
var hub = hd.ResolveHub("AdminHub") as AdminHub; 
hub.SendMessage("woohoo"); 

作品。より良い/より好ましい方法があれば、共有してください。

+5

これはこれ以上機能しません(SignalR2では?)。 http://stackoverflow.com/questions/17896739/use-hub-methods-from-controllerを参照してください。 –

+0

'DefaultHubManager'はSignalR 2.xに存在しますが、' hub.Context'はnullなので、すべての操作が失敗します。 – Dai

+0

これはsignalR 2.0で動作しますが、例外が発生しますHubPipelineで作成されていないHubインスタンスを使用するとサポートされません – GreyCloud

18

ハブの外部からブロードキャストする場合は、ハブのコンテキストを取得するにはGlobalHost.ConnectionManager.GetHubContext<MyHub>()が必要です。このコンテキストを使用して、.Clientsプロパティを使用してブロードキャストできます。

サンプルコードに示されているように、すでにハブコンテキストを取得していますが、ハブの内部で行うことは、私の意見では正しく感じられません。コントローラーのアクションからSendMessage()のロジックだけを使用している場合は、コントローラーのアクションにコードを移動し、そこからGetHubContext<T>()で取得したハブコンテキストを使用します。

このシナリオでは、またはContextプロパティは常にnullになります。これは、SignalRがサーバーへの要求時に関与せず、したがってプロパティを提供できないためです。

関連する問題