2017-09-30 13 views
0

私はこの質問が以前に尋ねられたかもしれないと思ったが、まだ成功の実装が見つからなかったので、新しい質問をするように促した。同じサーバー内のSignalRの複数のエンドポイント

私のシナリオは次のようになっています。ASP.Netサイトで実行しているサーバーが1台あります。メインのSignalRサーバは、OWINを使用してアプリケーション内で自己ホストされます。これがlocalhost:8181の下で実行されているとします。クライアントとサーバーの間で通信するために必要なすべての機能を含む1つの中央ハブがあります。通常の使用では、クライアントはこのエンドポイントへの呼び出しを行います:http://localhost:8181/signalr/hubs

ここで、http://localhost:8282/signalr2/hubsのような別のSignalRのエンドポイントを追加したいと思います。その理由は、中央ハブでは、特定のクライアントだけが使用する機能があるからです。特別なクライアントがその機能を呼び出せる唯一のクライアントであり、その中でデータは最初のエンドポイントの他のクライアントに転送されます。理論的には、私は1つのエンドポイントを使用してそれらを管理することができますが、私は簡単なデバッグとメンテナンスのために特別なクライアントを分離したいと思います。

今、同じASP.Netアプリケーションで異なる構成を使用して両方を起動できます。特別なクライアントを含むすべてのクライアントからの接続が機能しています。ただし、この時点では、特別なクライアントをフィルタリングして他のクライアントに送信するための良い方法はわかりません。以下

私が実装している両方のエンドポイントのための構成コードである:

_signalR = WebApp.Start<SignalRStartup>("http://localhost:8181"); 

_signalR2 = WebApp.Start<SignalR2Startup>("http://localhost:8282"); 

サンプルハブコード:

[HubName("NotificationHub")] 

public class NotificationHub : Hub 
{ 
    // Special client invoke this, the msg is passed to other clients in the 8181 endpoint 
    public void A(string msg) 
    { 
     // This Clients object should refer to other clients in 8181 endpoint 
     Clients.All.sendMsg(msg); 
    } 
} 

public class SignalRStartup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var hubConfiguration = new HubConfiguration 
     { 
      EnableDetailedErrors = true, 
      EnableJavaScriptProxies = true 
     }; 

     app.UseCors(CorsOptions.AllowAll); 
     app.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions { ShowExceptionDetails = true }); 
     app.MapSignalR(hubConfiguration); 
    } 
} 

public class SignalR2Startup 
{ 
    public void Configuration(IAppBuilder app) 
    {   
     var hubConfiguration = new HubConfiguration 
     { 
      EnableDetailedErrors = true, 
      EnableJavaScriptProxies = true, 
     }; 

     app.UseCors(CorsOptions.AllowAll); 
     app.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions { ShowExceptionDetails = true }); 
     app.MapSignalR("/signalr2", hubConfiguration); 
    } 
} 

Application_Start()で、Iは、これらの追加しましたClientsのために自動的に解決されますGlobalHostは、その例外を除いてすべてのクライアントを含むことを意味します。 私のシナリオを達成するためには、正しい実装は何ですか?また、適切な実装を使用する場合、どのように正しいクライアントを見つけるか、そのメッセージを除外できるメッセージを送信しますか?

を要約すると:

SignalR 1 & SignalR 2 has same NotificationHub with function A 
Client 1 -> SignalR 1 (localhost:8181)  
Client 2 -> SignalR 1 (localhost:8181)  
SpecialClient -> Signalr 2 (localhost:8282) 

SpecialClient invoke A(), in which, data is send to Client 1 & Client 2, exclude SpecialClient 

答えて

0

特別なクライアントは、私が機能 、その中を呼び出すことができるようにしたいだけのクライアントで、データが他のクライアントに転送され

最も簡単な方法は、それらを分けないことです。

何らかの形で、そのクライアントを "特別なものにする"ことを知っておく必要があります。そして、それをロールに入れて、他のクライアントがアクセスできないメソッドにアクセスできるようにします。

特定のメソッドへのアクセスを制限する -

[Authorize(Roles = "Admin")] 
public class AdminAuthHub : Hub 
{ 
} 

は、より多くの情報を見つける - https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization

クライアントにデータを送信するためにどのように - >Clients.Othersが送信者(特別なクライアント)を除き、他の皆に送信します。しかし、あなたの特別なクライアントを "特別な"グループに入れ、あなたの他のすべてのクライアントを "特別でない"グループに入れて、使用したいグループにのみブロードキャストしてください。Clients.Group

関連する問題