2013-07-27 4 views
15

私はSignalR2を使用しています。コントローラの動作の中から、どのように私のハブの方法を使うことができるのか分かりません。コントローラのHubメソッドを使用しますか?

私は、次の操作を行うことができます知っている:

var hub = GlobalHost.ConnectionManager.GetHubContext<T>(); 
hub.Clients.All.clientSideMethod(param); 

しかし、それはクライアント側で直接メソッドを実行します。

サーバー側にビジネスロジックがある場合はどうすればいいですかClientSideMethod(param)メソッドクライアント側から呼び出されたときと同じ方法でコントローラから呼び出したいのですが?

現時点では私のハブの内部にpublic static void ClientSideMethod(param)を使用しており、この方法ではConnectionManagerIHubContextを使用しています。

これを行う方がいいですか?

機能していない、次の(SignalR 2にもはや?):あり

var hubManager = new DefaultHubManager(GlobalHost.DependencyResolver); 
instance = hubManager.ResolveHub(typeof(T).Name) as T; 
instance.ClientSideMethod(param); 

私はクライアントにアクセスするときに例外を、「ハブはハブのパイプラインがサポートされていない経由で作成されていません」を取得。

+0

私はJSであると仮定し、クライアントからそれをしないのはなぜ、あなたはAjaxリクエストを行うと、あなたは、コントローラ – MEYWD

+1

@MEYWDに必要なものを行うことができます。たとえば、私は何かが起こったときに私が更新したいadminインターフェースを持っているからです。例えば。クライアントは特定のページを訪問するので、そのページからコントローラーアクションでハブメソッドをトリガーしたいと思います。実際のクライアントはそれを気にしないので、なぜ彼はそのメッセージを投稿すべきですか? – ChrFin

+0

私は何か似たようなことをしました。私はクライアントと管理者(特別なクライアント)を持っています。管理者はコマンドを送信し、クライアントからの応答を待ちます。私は管理者のリストとハブ管理者はクライアントを選択し、他の管理者がそれを使用しないように予約し、コマンドを送信し、ハブがクライアントに中継し、クライアントはハブに応答を返し、応答は中継者に中継され、応答が印刷される画面は – MEYWD

答えて

11

をいくつかの改善とmichael.rpのソリューション@使用しています:

public abstract class Hub<T> : Hub where T : Hub 
{ 
    private static IHubContext hubContext; 
    /// <summary>Gets the hub context.</summary> 
    /// <value>The hub context.</value> 
    public static IHubContext HubContext 
    { 
     get 
     { 
      if (hubContext == null) 
       hubContext = GlobalHost.ConnectionManager.GetHubContext<T>(); 
      return hubContext; 
     } 
    } 
} 

そして私:

私は、次の基本クラスを作成しました実際のハブ(例: public class AdminHub : Hub<AdminHub>)私は、次のような(静的)メソッドを持っています:

/// <summary>Tells the clients that some item has changed.</summary> 
public async Task ItemHasChangedFromClient() 
{ 
    await ItemHasChangedAsync().ConfigureAwait(false); 
} 
/// <summary>Tells the clients that some item has changed.</summary> 
public static async Task ItemHasChangedAsync() 
{ 
    // my custom logic 
    await HubContext.Clients.All.itemHasChanged(); 
} 
11

それはあなたのビジネスルールを実装し、あなたのハブとあなたのコントローラの両方によって呼び出される「ヘルパー」クラスを作成するかもしれない作品:私は「良い解決策」Iを見つけることができませんでしたよう

public class MyHub : Hub 
{ 
    public void DoSomething() 
    { 
     var helper = new HubHelper(this); 
     helper.DoStuff("hub stuff"); 
    } 
} 

public class MyController : Controller 
{ 
    public ActionResult Something() 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     var helper = new HubHelper(hub); 
     helper.DoStuff("controller stuff"); 
    } 
} 

public class HubHelper 
{ 
    private IHubConnectionContext hub; 

    public HubHelper(IHubConnectionContext hub) 
    { 
     this.hub = hub; 
    } 

    public DoStuff(string param) 
    { 
     //business rules ... 

     hub.Clients.All.clientSideMethod(param); 
    } 
} 
+0

+1であるので、それはすでに私の方が良い方法ですが、ハブの方法を「直接的に」使用することができます。 – ChrFin

+0

@ChrFinアセンブリ内からハブメソッドを正常に呼び出す方法を見つけましたか?ハブのインスタンスを呼び出すことができなくても、このオプションは最もDRYで区画化されているように見えます。 –

+0

@BrandonWittwer:いいえ、実際はありません。私はまだ「ネイティブソリューション」を望んでいるので、回答を受け入れたものとしてマークしていません。私は私の瞬間に私の解決策で答えを追加します... – ChrFin

関連する問題