前提・実現したいこと
ポーリングして、更新があればSignalRで通知するシステムを作りたいです。
SignalRのHubは常時立ち上がってる状態です。
クライアントが接続した瞬間から、ポーリングを実行し、切断されたらポーリングを停止する仕様にしたいです。
発生している問題・エラーメッセージ
IHostedServiceで起動時からポーリングするクラス最初に試作で作る、それを変更して、下記のようなコードを作りました。ぶち当たった壁は下記のコードで、ポーリング専用クラスのコンストラクタの引数IHubContext<ChatHub> hubContext
をHub側でどのように設定すればいいのかがわかりません。
.net MVCでSignalRを参考に、ポーリング専用クラス内でHubを直接呼び出せる方法があるらしいのですが、全然わからず断念。
ハブの外部からメッセージを送信するを参考にしようとしたのですが、内容は、HostedServiceで立ち上げる方法と同じなので、行いたいこととは程遠くダメでした。
.net MVCでSignalRと似た感じで、直接ポーリング専用クラス内でメッセージを送信出来たらうれしいです。
ご教示のほどよろしくお願いいたします。
該当のソースコード
CSharp
1// ハブ側 2public override async Task OnConnectedAsync() 3{ 4 _ConnectionId = Context.ConnectionId; 5 _cts = new CancellationTokenSource(); 6 _ct = _cts.Token; 7 DoPollingClass dpc = new DoPollingClass(_ConnectionId); 8 dpc.StartPolling(_ct); 9 10 await base.OnConnectedAsync(); 11}
CSharp
1// ポーリング専用クラス 2 3// ローカル変数 4private readonly IHubContext<Hub> _hubContext; 5private static string _ConnectionId; 6 7// コンストラクタ 8public DoPollingClass(string ConnectionId, IHubContext<ChatHub> hubContext){ 9 _ConnectionId = ConnectionId; 10 _hubContext = hubContext; 11} 12 13public async void StartPlling(CancellationToken cancelToken) 14{ 15 cancelToken.ThrowIfCancellationRequested(); 16 Console.WriteLine("ポーリングを開始"); 17 18 while (true) 19 { 20 Console.WriteLine("探索中"); 21 // 処理を中略 22 await _hubContext.Clients.Client(_ConnectionId).SendAsync("method name", "message"); 23 Thread.Sleep(1000); 24 } 25} 26
補足情報(FW/ツールのバージョンなど)
- Microsoft.AspNetCore.SignalR
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。