HttpContext.Current.Items

2380 ワード

HttpContextのItems集合はASP.NETが最もよく守っている秘密の一つです.これはIDictionaryキー/値ペアのオブジェクトセットであり、HttpRequestの生存期間で共有されます.HttpRequestにのみ存在します.ステータスはなぜこんなに短い時間で保存されますか?次の理由があります.
IHttpModuleとIHttpHandlerの間でコンテンツを共有します.カスタムIHttpModuleを作成すると、後でページで使用するためにユーザーの情報を格納できます.
1ページの2つのUserControlインスタンス間で通信します.バナー広告用のUserControlを作成すると仮定します.このコントロールの2つのインスタンスは、HttpContext.Itemsで広告を選択し、同じページに重複する内容が表示されないようにします.
コストの高い呼び出しの結果を格納し、この呼び出しがページに複数回表示されないようにします.複数のUserControlがある場合、各UserControlは高価な大規模なデータベースからデータのセットを抽出して表示し、これらのUserControlはHttpContext.Itemsで必要なデータを抽出します.データベースは一度だけ使用されます.
1つのHttpRequestの各ユニットは、同じまたは類似のデータを処理する必要があります.データの生存期間が1つのリクエストであれば、HttpContextを使用することも考えられる.Itemsは短期キャッシュとして使用されます.
Itemsコレクションは、この章で前に使用した多くのコレクションと同じオブジェクトを格納します.検索時には、これらのオブジェクトを特定のタイプに変換する必要があります.
Webをサポートするデータベース・アクセス・レイヤでは、要求された事前キャッシュは、以下の符号化モードを用いて容易に実現される.なお、このサンプルコードは、MyDataクラスを含まない設計モードであり、プレゼンテーションにのみ使用されます.

  
    
  1. VB  
  2. Public Shared Function GetExpensiveData(ID As Integer) As MyData  
  3.   Dim key as string = "data" & ID.ToString()  
  4.   Dim d as MyData = _   
  5.       CType(HttpContext.Current.Items(key), MyData)  
  6.   If d Is Nothing Then  
  7.     d = New Data()  
  8.     'Go to the Database, do whatever...  
  9.     HttpContext.Current.Items(key) = d  
  10.   End If  
  11.   Return d  
  12. End Function  
  13. C#  
  14. public static MyData GetExpensiveData(int ID)  
  15. {  
  16.   string key = "data" + ID.ToString();  
  17.   MyData d = (MyData) HttpContext.Current.Items[key];  
  18.   if (d == null)  
  19.   {  
  20.     d = new Data();      
  21.     //Go to the Database, do whatever...  
  22.     HttpContext.Current.Items[key] = d;  
  23.   }  
  24.   return d;  

このコードは、現在のHttpContextのItemsセットをチェックし、データがあるかどうかを確認します.ない場合は、対応するサポート・データベースから抽出し、Itemsセットに格納します.この関数の後続の呼び出しは、同じHttpRequestでキャッシュされたオブジェクトになります.
すべての最適化とキャッシュと同様に、未熟な最適化はすべての罪の禍根です.キャッシュのニーズと改善状況をよく考慮する必要があります.感覚だけでキャッシュするのではなく、必要に応じてキャッシュする必要があります.