2012-03-20 8 views
1

異なるバージョンのキャッシュプロファイルを使用して、いくつかのページのサーバーに異なるバージョンをキャッシュします。私はVaryByCustomパラメータを使用していますwitchはオーバーロードされています。 1。それは私の登録ユーザーはすぐにページ上の非常に異なる情報を持っていることが判明。私の質問は、ユーザーが何もキャッシュしないよりも登録ユーザーであると言うことが可能ですか?登録されていないユーザーのためのキャッシュのみASP.NET MVC

+0

「登録済み」と言うと、「現在ログインしていますか? – danludwig

+0

はい、それは私が意味したものです、それはそれはユーザーのいくつかのタイプ(ユーザーは、彼らが持っているかどうかにいくつかのプロパティによって異なります)でさえも問題ではありません –

答えて

1

あなたはこれを試みることができる:コメント

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if ("User".Equals(custom, StringComparison.OrdinalIgnoreCase)) 
    { 
     if (!string.IsNullOrWhiteSpace(Thread.CurrentPrincipal.Identity.Name)) 
      return Guid.NewGuid().ToString(); // do not cache anything 
     return string.Empty; // cache for non-signed-in users 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 

返信をGUIDはグローバル一意識別子です。 Guid.NewGuid().ToString()を呼び出すたびに、一意の文字列が得られます。 技術的には、結果は依然としてにキャッシュされますが、一意の文字列を使用してキャッシュされます。そのため、サインオンした2人のユーザーに同じキャッシュ結果が表示される可能性は極めて低いです。実際には、サインオンした同じユーザーがページのキャッシュ結果を見る可能性は同じです。

何かをキャッシュしたくない場合は、手動でキャッシングを実装することもできます。しかし、私は、あなたがアクションメソッドに「OutputCacheAttributeを使って、署名されていないユーザをキャッシュするが、サインオンしたユーザはキャッシュしない」と言うことはできないと思う。

+0

私はこれを試してみませんか?なぜあなたは言うときに彼は何もキャッシュしません:return Guid.NewGuid()。ToString(); –

+0

ありがとう、おそらく最高のオプションは、少なくとも私は無駄にメモリを使用していないだろうすべてのユーザーの異なるバージョンのキャッシュです。もう一度、ありがとう。 –

+1

はい、それは私たちが行うことです。 '' User "'文字列の 'GetVaryByCustomString'オーバーライドから' Thread.CurrentPrincipal.Identity.Name'を返します。このようにして、各ユーザーはそれぞれ独自のキャッシュバージョンを取得し、匿名ユーザーはすべて個別のキャッシュバージョンを共有します。 – danludwig

0

サインインしたユーザーのキャッシュを停止することができます。カスタムキャッシュプロバイダーを実装することで、追加、設定、削除の方法で何かのキャッシュを防止できます。また、global.asaxのユーザ別にキャッシングを行うこともできます。なぜ私はこのアプローチを使用したことがない理由は、私はまだいくつかのページのキャッシュをユーザのために必要とし、私はキャッシングプロバイダクラス内の現在のキャッシングプロファイルを発見する方法を見つけられなかったので、プロフィール。何らかの理由で、すべてのページで署名されたユーザーのキャッシュを防止したいのであれば、これはより良いアプローチだと思うし、GUIDを使用するカスタムアプローチによって異なります。

関連する問題