私はこの質問が以前に尋ねられたかもしれないと思ったが、まだ成功の実装が見つからなかったので、新しい質問をするように促した。同じサーバー内の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