2011-10-03 8 views
68

私は、サーバーとクライアント間で通信するためのSignalRハブをセットアップしました。ハブサーバーのサイドコードは、Hooking.csというクラスに格納されています。私が望むのは、Hooking.csで定義されたメソッドを呼び出して、アプリケーション内のどこからでも接続されたクライアントにメッセージをブロードキャストできるようにすることです。 Hooking.csの新しいインスタンスがすべてのクライアント/サーバ・コールのために作成されているようですので、私は、私はHooking.csで定義されたメソッドのテスト()とシステム内の他の場所からのSignalRハブクライアントの呼び出し

var hooking = new Hooking(); 
hooking.Test(); 

のようなものを使用することができるだろうと期待していましたこのよう

public static void Test() { 
    Clients.test() 
} 

とJavaScript

var hooking = $.connection.hooking; 
hooking.test = function() { alert("test worked"); }; 
$.connection.hub.start() 

クライアント側は、残念ながらそれはないと同じようにクライアントは静的ではないため、静的メソッドからはアクセスできません。

SignalRソースコードを見て、私は有望な方法を見つけました。Hubs.Invoke(string hubName, string method, params object[] args)だから、私はHubs.Invoke("Hooking", "Test")のようなものを使うことができると思っていますが、動作させることはできません。

これですべてのヘルプは非常

+0

多分あなたは私を助けることができます;)メッセージを発行した発信者ではなく、他のすべてのクライアントのブロードキャストメッセージでjsコードを実行する方法:) – GONeale

+0

残念ながら私はしません。私はこのクライアント側を処理していて、クライアントのIDを返信して返します。idが一致すれば関数を呼び出しません。 –

答えて

1

をいただければ幸いそれはhttps://github.com/SignalR/SignalRからSignalR.Samples.Hubs.ChatChat.csで行うのかを見てください。

静的なDictionary<TKey, TValue>のインスタンスが上部でインスタンス化されていることがわかります。したがって、永続的インスタンス(?)または何らかの形で更新されているその配列のどちらかで永続的に維持されていると思います。

これをチェックして、David Fowlerがこれに最も適している可能性があります。

+0

ええ、私はSignalRサンプルを使ってこれを試しています。辞書は静的なので、クラスの複数のインスタンスにわたって情報が保持されるため、私は単にHooking.csのインスタンスを作成して使用することができますが、それは使えません。 –

23

Hub.GetClientsがバージョン0.4.0で消滅しました。

wikiあなたが今使用することができますから:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
dynamic clients = connectionManager.GetClients<MyHub>(); 
+7

そして追加することを忘れないでください「SignalR.Infrastructureを使用しています。 – nmat

101

これはSignalR 2.xのための正しい方法です:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.addMessage(message); 

基本的に、あなたは、現在のホストのための依存関係のリゾルバを使用することができますIConnectionManagerインターフェイスを解決すると、ハブのコンテキストオブジェクトを取得できます。

さらに詳しい情報はofficial documentationにあります。

5

あなたは簡単this-

public class ClassName 
{ 
    ........ 
    ........ 
    private IHubContext _hub; 

    public BulletinSenderController(IConnectionManager connectionManager) 
    { 
     _hub = connectionManager.GetHubContext<McpHub>(); 
     ........ 
     ........ 
    } 

    ............ 
    ............ 
} 

2のような依存性注入によってインスタンス化するこの2工程 -

  1. に従うことによってハブを使用することができます。this-

    _hub.Clients.All.onBulletinSent(bulletinToSend); 
    

    もっと似hubオブジェクトを使用してhereを見つけることができます。

    例コードはin this git repoです。

関連する問題