2012-02-28 19 views
1

クライアントにキャッシュする必要がある小さなデータオブジェクトがあります。名前や役割などのユーザー情報です。私はHttpCacheability.Privateセットを持っています。 Fiddlerを使用してページを表示すると、キャッシュがプライベートであることがわかりますが、別のユーザーがサイトに移動したときに最初にログインしたユーザーのキャッシュされた値が表示されているときに、私はそれがサーバーの値を格納しているようだ。HttpCacheability.Private期待どおりに動作しません。

たとえば、キャッシュの有効期限は10分です。キャッシュが期限切れになった後、私はサイトに行きます。キャッシュはnullなので、db(現在ログインしているユーザーに基づく)から自分のユーザー情報を検索し、キャッシュに書き込みます。今度はジョン・ドゥが3分後にサイトに行き、彼は彼の代わりに自分の情報を表示しています。

私は、クライアントではなくサーバーで各ユーザーの情報をキャッシュするために必要なことがわかりません。どんな助けでも感謝します。

おかげで、

ロンダ

public static void AddUserToCache(User userToCache, string Key) 
    { 
     HttpContext context = HttpContext.Current; 
     HttpCachePolicy cachePolicy = context.Response.Cache; 
     cachePolicy.SetCacheability(HttpCacheability.Private); 

     if (context.Cache[Key] == null) 
     { 
      context.Cache.Add(Key, userToCache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(UIConstants.CACHETIMEOUTHOURS, 0, 0), System.Web.Caching.CacheItemPriority.Default, null); 
     } 
    } 




if (Cache["User"] == null) 
     { 
      user = BusinessUtility.GetCurrentUser(); 
      if (user != null) 
      { 
       CacheUtility.AddUserToCache(user, "User"); 

      } 

     } 
     else 
     { 
      user = (User)Cache["User"]; 
     } 
+0

私は私のコードの元のバージョンで私はキャッシュプライスのものを持っていなかったことに言及する必要がありますプライベートはデフォルトにする必要があります。それはいずれの方法でも動作しません。 – Rhonda

答えて

0

context.Cacheは、サーバー側のキャッシュであり、そのデータが住んでいるのです。それを変更する方法はありません。そこに格納されているデータは、サーバーサイドのコードからのみアクセスできます。

一方、context.Response.Cacheは、httpヘッダーとして渡され、ブラウザと中間プロキシに、サーバーからブラウザへの応答をキャッシュするかどうかを指示します。

次に、データをキャッシュすることで達成しようとしていることをもう少し把握します。あなたはウェブサーバからデータベースへのヒットを減らそうとしているのか、ウェブサーバへのヒットを減らそうとしていますか?

DBヒットを減らしてからcontext.Cacheコードを使用する場合は、キーに格納/取得するユーザーの固有識別子があるように変更してください。 cachePolicy.SetCacheabilityを取り除き、物事を混乱させないようにしてください。

ウェブサーバへのヒット件数を減らそうとしている場合は、cachePolicy.SetCacheabilityコードを貼って、context.Cacheのコードを削除してください。

+0

データベースへのヒットを減らそうとしています。私は一意のIDをキーに追加し、サーバー上でそれをテストします。応答していただきありがとうございます。 – Rhonda

関連する問題