0

バックグラウンド:

これが私のプロジェクトです。ASP.NET MVC4 Web アプリでは、ユーザーは情報を入力してサーバーに投稿します。その後、サーバーは長いタスクの実行を開始します (1 秒未満から 20 分まで。通常は約 4 分)。

Controller アクションですべての作業が行われるのは望ましくありません。そうしないと、ユーザーは何が起こっているのかについてのフィードバックなしで完了するのを待つ必要があります。したがって、ユーザーをステータスページに送り、サーバーからそのページに更新を送信したいと思います。

現在の部分的なソリューション:

ここに私がこれまでに持っているものがあります: コントローラーは長時間実行されるアクションでタスクを開始し、ユーザーをステータス ページに誘導します。タスクが実行されると、SignalR を使用してステータス ページにメッセージが返され、ページが更新されます。

問題:

  1. SingalR はすべてのクライアントを更新しているため、複数のユーザーが同時にこのアプリを使用することはできません。SignalR には特定のクライアントにメッセージを送信する方法があることがわかりましたが、どうすればクライアント ID をコントローラーに取得できますか? SignalR は、セッションへのアクセスを困難 (不可能?) にします。
  2. ステータス ページが読み込まれる前にタスクが終了した場合 (または、ページが読み込まれる直前に更新の間に一時停止がある場合)、ステータス ページにはタスクに関する情報がありません。繰り返しますが、セッションのステータスを保存するのはいいことですが、それを機能させることができないようです。

SignalR と ASP.NET でクライアントの状態を同期させる方法はありますか? SignalR は仕事に適したツールですか?

4

2 に答える 2

2

必要なものだけのライブラリを作成しました。これは、SignalR のラッパー ライブラリです。ある種のメッセージバス/イベントアグリゲーターが必要です。私のライブラリは、メッセージ バスと SignalR クライアントの間でプロキシします。

このようにして、バックグラウンド ワーカーは簡単な方法で進行状況レポートをバックエンドの他のコンポーネントとクライアントの両方にシームレスに送信できます。

ナゲットを使ってインストール

Install-Package SignalR.EventAggregatorProxy

サービス バス / イベント アグリゲーターを実装する必要があります。Caliburn Micro はフットプリントが軽い

Install-Package Caliburn.Micro.EventAggregator

設定方法はwikiに従ってください

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

設定が完了したら、JavaScriptからこのようなイベントを聞くことができます

ViewModel = function() {
   signalR.eventAggregator.subscribe(MyApp.Events.BackgroundWorkerProgressEvent, this.onProgressEvent, this);
};

ここにデモプロジェクトがあることを忘れていました https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/tree/master/SignalR.EventAggregatorProxy.Demo.MVC4

于 2013-08-29T19:37:54.707 に答える
1

問題 1 の場合、クライアントはタスクを開始する要求を送信し、MVC は要求を処理し、taskId を含む応答を送信する必要があります。新しい Web ページから SignalR 接続が開始され、Register(taskId) のようなハブ メソッドを定義し、サーバーで taskId を Context.ConnectionId にマップする必要があります – Gustavo Armenta 8 月 29 日 19:04 に

@GustavoArmenta OK、サーバーはクライアントにタスクの何らかの ID を返信し、クライアントは SignalR を介して接続し、その TaskID を登録します。これがクライアント ID にマップされます。次に、実行中のタスクはそのマッピングを使用して情報を送り返しますよね? しかし、タスクはどのようにしてタスク ID からクライアント ID へのマッピングにアクセスするのでしょうか? コントローラーは SignalR ハブの永続データにどのようにアクセスしますか? – ダネーション 8 月 29 日 19:15

まあ、静的辞書を使用してメモリにマッピングを保存するか、データをデータベースに永続化できます – Gustavo Armenta 8 月 30 日 16:47 に

@GustavoArmenta、私はあなたのオプションを使用することになりました(両方の問題を修正できました)。回答として追加していただければ、受け入れます。– ダネーション 9 月 18 日 4:17

于 2013-09-24T22:05:13.117 に答える