2016-03-22 6 views
14

私は、サーバーAで実行されるASP.NET MVCアプリケーションと、サーバーBで実行されるいくつかのWebサービスを持っています。私は、サーバーAでSignalRを使用しているリアルタイム通知を実装しました。サーバーB(メインWebアプリケーション)から提供されるビューにメッセージを送信できるようにする必要があります。したがって、私はチュートリアルhereにRedisバックプレーンを関与させようとしています。サーバーAでの私のスタートアップでSignalRでRedisを使用する

、私は次のよう追加しました:ここ

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc"); 
app.MapHubs(); 

、私は「て、myAppは、」チャンネルを示していると仮定し、私はRedisのコンソール上でpublish abc "hello world"を実行すると、私は加入者を見ることができますカウントは1として返されましたが、私はSignalRハブがチャンネルとどのようにやり取りするかを理解することができません。サーバー/ビューでメッセージを受け取る場所はどこですか? 1つの赤ちゃんチャンネルにのみ登録できますか?特定のチャンネルを購読するように動的に設定することはできませんか?

EDIT:abcに登録すると、redisコンソールでSignalRを使用して実装されたチャットアプリケーションから送信されたメッセージが表示されます。

また、私はredisチャネルからメッセージを受信する際に、自分自身のredisリスナを実装しました。これは、signalRハブ機能を呼び出します。私はこれを行うには別の方法が必要であると確信しています。私はredisバックプレーンが私を助けることができるが、それがどのように動作するのかわからないことを望んでいる。

+0

一つの簡単なソリューションを提供します。 サーバーBの希望のチャネルにメッセージをパブリッシュします。サーバーAのチャネルをサブスクライブし、メッセージを手動でsignalRハブにプッシュします。 –

+0

これは馬鹿に聞こえるかもしれませんが、わかりやすく理解するのに役立ちます。これは、表示するすべてのメッセージがサーバーAを介してのみ送信され、サーバーBは直接送信されないことを意味しますか?ここでsignalR.redisの使用は何ですか? – labyrinth

+0

これを確認してください: - http://gigi.nullneuron.net/gigilabs/backplane-signalr-scaleout-with-redis/また以下もあります: - http://www.asp.net/signalr/overview/performance/scaleout -with-redis –

答えて

27

バックプレーンは、サーバー間でメッセージを配信します。ここで

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");

ABCは、このチャネルにRedisのサーバーに接続されている方のサーバ手段は、彼らがメッセージを共有すること、Redisのチャネルです。 SignalRチャンネル(グループ)はRedisチャンネルとは異なります。 SignalRチャンネル(グループ)メッセージも共有できます。

次に、サーバーにMicrosoft.AspNet.SignalR.Redis NuGetをインストールしてください。

は次のようにRedisのためにあなたのサーバーを接続します

GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName"); 
app.MapSignalR(); 

その後、以前のように自分のsignalrを使用しています。他に何もする必要はありません。

サーバAがクライアントにメッセージを送信すると、メッセージは最初にRedisに送信されます。すると、Redisはすべての加入者(サーバーAとB)とメッセージを共有します。次に、AとBはそのクライアントにメッセージを送信します。 (また、viceversaが真であり、Bがメッセージを送信する場合も同じです)。

Aがクライアントにメッセージを送信したとします。 _context.Clients.All.TestMessage("Hello");

これは次にA、Bの両方が彼らのクライアントにこのメッセージを送信しますRedisのためにとRedisのは、AとB

でこれを共有する最初に移動します。

_context.Clients.All.TestMessage("Hello");

しかし、あなたは、物事のこれらの種類を心配する必要はありません。私は前に言った。パッケージをインストールし、サーバーを再接続して、以前と同じようにsignalrを使用します。

ご質問がありましたら、答えはYesです。サーバーBは、SignalrバックプレーンによってサーバーAクライアントにメッセージを送信できます。

この画像は私が言ったことをまとめたもの:

enter image description here

+0

詳細な説明をありがとう!ここで、私たちは、redisチャネルを動的に購読/購読解除できず、代わりにサーバAとBのグローバルチャネルを使用し、これらのチャネル上のすべてのメッセージを使用することができますか? – labyrinth

+0

まず、Redis ChannelとSignalr Channelは別のものです。第二に、シグナルをマッピングした後に、赤血球チャネルを動的に変更することはできません(なぜ、変更したいのですか?)。あなたが動的に使用できるSignalrチャンネル(グループ)。サーバーBがメッセージをグループ(チャネル)に送信する場合、このグループ(チャネル)に接続されているサーバーAクライアントはこのメッセージを受け取ります。 –

+1

あなたは質問があるかどうかを尋ねることができ、あなたの質問に答えた場合はこれを答えとして受け入れることができます –

関連する問題