1

サーバーから返されるすべてのリクエストで「ユーザー メッセージ」を利用できるようにしたいと考えています。ユーザー メッセージがない場合、メッセージは空白に戻ります。アイコンがある場合、リクエストが完了すると、各ユーザー画面でアイコンがアクティブになります。

[編集] 「ユーザー メッセージ」は、私が展開しているアプリケーションの管理者によって設定されているものです。管理者は、フィールドにテキストを入力し、ボタンをクリックして、このメッセージをシステムの他のすべてのユーザーに送信できます。別のユーザーが何らかのアクションを実行するたびに、現在のユーザー メッセージが JSON 応答に添付され、フロントエンドによって処理されます。

これを最適化するために、メッセージを(データベースではなく)メモリに保存する必要があります。

私は静的を使用しようとしました。HttpApplicationState を使用しようとしました。どちらの場合も、ユーザー メッセージの値は一定期間後に「空白」になります。いくつかの調査の結果、静的と HttpApplicationState の両方がIISの影響を受け、いつアプリケーション プールをリサイクルするかが決定されるようです。(またはそのようなもの)

この静的変数の揮発性は神秘的です。これは静的である必要があります。IIS自体が存続している限り、この変数も存続するはずです。ある種の「リセット」などに依存するべきではありません。HttpApplicationState は、私が完全に理解していない他の状況です。

信頼できる不揮発性変数に値を格納する方法が必要です。この値を今日設定した場合、 IISを停止して再起動しない限り、明日または来週には設定されているはずです。

何か助けはありますか?


以下の受け入れられた回答に従って、問題を解決するために私が行ったことは次のとおりです。

  1. ユーザーメッセージはいつかのものです。そのため、メッセージが管理者によって設定されると、その時点で応答をデータベースに保存し、それを Application["UserMessage"] オブジェクトに保存します。
  2. ユーザーからのラウンドトリップが発生すると、ユーザー メッセージのメモリ内テキストが json の戻り値に追加されます。
  3. 管理者はいつでもメッセージをクリアできます。これにより、メモリ内メッセージとデータベース フィールドの両方がクリアされます。
  4. IIS が十分であると判断し、アプリケーションをリサイクルすると、Application_Start() メソッドは (他のタスクの中で) ユーザー メッセージが設定されたときに格納されたデータベース値からユーザー メッセージを再シードします (手順 1 に従って)。

これで、アプリケーションは期待どおりに動作します。システムへのユーザー要求ごとにデータベースに追加料金が支払われることはありません。ユーザー メッセージは常にメモリから取得されます。これに加えて、ユーザー メッセージのデータベースが更新またはロードされる回数はごくわずかです。

4

2 に答える 2

3

アプリケーション キャッシュは、そのための適切な場所です。あなたにとっての問題は、あなたがそれに頼ることができないと思うことです。私の回答の後半を参照してください。ここでは、iis の再起動後または iis がアプリケーションをリサイクルした後でも、値が常にそこにあることを確認する方法を見つけることができます。

値はアプリケーション キャッシュに保存できます。次のように行うことができます

Application.Add(name,object)

後で、このコードを使用して各リクエストで取得できます

Application[name]

セッションのように機能しますが、唯一の違いは、アプリケーション全体であり、すべてのユーザーからのすべての要求が取得されることです。初めて値を割り当てて設定するときは、データベースとアプリケーションキャッシュに保存して、後でデータベースからクエリを作成し、値がそこにない場合はアプリケーションキャッシュに保存してから、アプリケーションキャッシュから取得できるようにします。

Application_Start()アプリケーションが起動または再起動するたびに発生するイベントで、データベースからアプリケーション キャッシュを復元する必要があります。このようにして、常にアプリケーション キャッシュにあることを確認できます。

于 2012-10-09T14:46:37.153 に答える
2

信頼できる不揮発性変数に値を格納する方法が必要です。この値を今日設定した場合、IIS を停止して再起動しない限り、明日または来週には設定されているはずです。

この場合、この値をメモリに格納することはできません。メモリは、アプリケーションの AppDomain をホストするために IIS によって割り当てられるものです。IIS はいつでもアプリケーションをリサイクルして、メモリを消去する可能性があります。IIS は存続し続けますが、アプリケーションは存続しません。したがって、それに依存することはできません。この場合の唯一の信頼できる解決策は、この情報をファイル、データベースなどの不揮発性ストレージに保持することです...選択は本当にあなた次第ですが、AppDomainのプロセスの外にある必要があります.

于 2012-10-09T14:42:50.007 に答える