2011-02-24 12 views
3

簡単な質問:グローバルスコープにデータを格納できる(「HttpRuntime.Cacheと同様の)」ユーザー単位のデータ記憶オブジェクト(Sessionに似ています)がありますか?ほとんどの場合、SessionHttpRuntime.Cacheに赤ちゃんがいました。グローバルスコープ内の.NETセッションの代替

完全な背景:私は元々1つのスレッド用に書かれたASP.NET Webサイトを持っています。今度は、特定のアクションがバックグラウンドスレッドを生成し、ブラウザーがサービスをポーリングしてステータス更新を取得するように変更しました。

私がこれを抱えている問題は、特定のデータがHttpContext.Session []オブジェクト(メンバーシップ認証トークンなど)に格納されていることです。これらのデータは、各ユーザーに固有で、バックグラウンドスレッドがアクセスできる必要があります。バックグラウンドスレッドはセッションを利用できません。

私はHttpRuntime.Cacheを認識していますが、ユーザーを分割してセッションが終了すると同時に期限切れにするには、マイクロマニュアル管理が必要です。一方、Sessionは、この時間を自動的に期限切れにします。また、適切な時には、すでにSqlMembershipProviderのようなもので使用されています。

私の質問は、セッションと似たような振る舞いをしていますが、グローバルスコープに存在するものがありますか?

+2

+1 for sessioncacheの赤ちゃん。 – jlafay

+0

@jlafayあなたは実際に私をLOLにしました – Kelsey

答えて

3

あなたが箱から必要とするものはないと思います。でも、私は次のようにします:

  1. ユーザーアプリケーションキャッシュ
  2. ユーザーIDまたは一意の識別子
  3. ストアのユーザーのための値でDictionaryまたは一部のオブジェクトリストキー作成します。これを使用して、必要なすべてのデータを保存します。
  4. ユーザー固有の識別子(ドメインなど)と競合する可能性があると思われる場合は、ユーザーIDの前にあるものをすべて考慮してください。
  5. セッションに似たキャッシュデータに有効期限を設定してください
+0

いくつかの危険があるようですが、 – Jeff

+0

@ジェフの危険はありますか?あなたは精緻化できますか? 'Cache'へのアクセス権があれば、このメソッドは必要なものすべてを処理する必要があります。それは単なるハイブリッドです。私は、アレクセイがコメントで言及したセッションをコピーするアプローチをすることをお勧めしません。 – Kelsey

+0

私はこのコメントを書き始めましたが、それを送るつもりはありませんでした。私はこの応答を得るまで、それが掲載されたことさえ知っていませんでした。それはなぜそれがdidnt何それは意味をなさない。もともと、私は範囲について懸念していましたが、私は自分でそれを解決しました。ごめんなさい! – Jeff

3

HttpContext.Currentオブジェクトをバックグラウンドスレッドのメソッドに渡してみてください。あなたは、渡されたHttpContextパラメータですcurrentContextを想定しcurrentContext.Sessionてバックグラウンドスレッドからセッションにアクセスすることができるはずです。

安全に複数のスレッドからHttpContextオブジェクトにアクセスする方法に、このblog postを参照してください。私は独自のデータベースや外部ストレージに、ユーザの移動状態を考えることをお勧め死ぬアプリケーションプールがすべてbackgoundの活動を再開したとき以来

+0

要求が終了した後にコンテキストを使用できません(OPの場合など)。 –

+0

ニースのブログ記事!あなたの反応を最初に読んだときに文脈を渡すことに興奮していましたが、今はブログ記事の後、本当に安全で必要なものがあれば少し時間をかけて考える必要があります。 – Jeff

3

。残念ながら、自動セッション管理の特典(スライドの有効期限)は失われますが、バックグラウンドのアクティビティが必要な場合は、より効果的です。つまり、必要に応じてIISプロセスからアクティビティを移動してプロセス/マシンを分離することができます。

+0

私はアプリケーションの再起動時にデータを失う心配はありません。外部ストレージは、httpcontext以外のセッションデータにアクセスする別の方法を提供します。 – Jeff

+0

この場合、単にセッションの内容をオブジェクト辞書の文字列としてクローンし、それをワーカースレッドに渡します。インメモリの場合、セッション状態のオブジェクトはセッション状態(SQL /セッションサービス状態とは異なります)のデータのコピーではないので、ワーカースレッドのデータを変更しないように注意してください。 –