Web アプリのスタートアップ コードで redis バックプレーンを構成しました。
var config = new RedisScaleoutConfiguration(hangfireRedisConnection, scaleoutEventKey);
GlobalHost.DependencyResolver.UseRedis(config);
app.MapSignalR();
Web アプリはタイマーでバックグラウンド ジョブを実行し、重要なイベントが発生した場合に起動してクライアントに通知します。バックエンドにクエリを実行した後、バックグラウンド ジョブは単純な HubService ラッパーを呼び出します。このラッパーは IHubContext を依存関係として受け取り、最終的にハブで Client.All.notify メソッドを呼び出してクライアントにプッシュします。
ハブサービス:
private readonly IHubContext applicationHub;
public HubService(IHubContext applicationHub)
{
this.applicationHub = applicationHub;
}
public void NotifyClient()
{
hubContext.Client.All.nofify(message); // <- this is always called, with and without the backplane, however with the backplane it doesn't make it to the client
}
HubContext は起動時に登録されます。
Container.RegisterInstance<IHubContext>(GlobalHost.ConnectionManager.GetHubContext<ApplicationHub>());
これは、バックプレーンがなくても正常に機能しますが、バックプレーンが構成されていると機能しません。呼び出しが行われていることをデバッガーで確認しましたが、クライアントに到達しません。
また、js または signalr.client クライアントを介してクライアント (Web アプリの外部) から signalr ハブを呼び出すと、バックプレーンは宣伝どおりに機能します。
最初にクライアントから呼び出しを開始せずに、Web アプリ自体からハブ コンテキストを直接呼び出しているシナリオに何か欠けているものはありますか?