イントラネット設定でWindows認証を使用して、Active Directoryから取得した情報をキャッシュします。キャッシュの目的は、ADからの読み取りが特に高速ではなく、毎回行う必要がないため、ページを高速化することです。 (データが頻繁に変更されることはありません)VaryByCustom - 間違ったユーザーにデータが表示される
これを行うには、私はHttpContext.Applicationでカスタムキーを設定します。
これはVaryByCustomを処理するためのGlobal.asaxにあるコードです:内部の私の方法では、
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
//Custom Cache Initiation Variable
if (HttpContext.Application["BrowsingSession_Key"] == null)
{
HttpContext.Application["BrowsingSession_Key"] = Guid.NewGuid();
System.Diagnostics.Debug.Print("BaseController.Initialize : " + HttpContext.Application["BrowsingSession_Key"].ToString());
}
}
そして最後に:私のBaseController(すべての私のコントローラによって継承されます)で
public override string GetVaryByCustomString(HttpContext context, string arg)
{
System.Diagnostics.Debug.Print("GetVaryByCustomString : " + context.Application["BrowsingSession_Key"].ToString());
if (arg == "BrowsingSession_Key")
{
object o = context.Application["BrowsingSession_Key"];
if (o == null)
{
o = Guid.NewGuid();
context.Application["BrowsingSession_Key"] = o;
}
return o.ToString();
}
return base.GetVaryByCustomString(context, arg);
}
コントローラ:
[OutputCache(Duration = 300, VaryByCustom = "BrowsingSession_Key", Location = OutputCacheLocation.Server)]
public ActionResult Index(HomeViewModel model)
//...
return View("index", model);
}
問題は簡単です。ページを表示する最初の人は、情報がキャッシュされ、BrowsingSession_KeyのGuidが設定される。 しかし、次のユーザーは5分のウィンドウ内でページを訪問し、最後のユーザーのキャッシュされたコンテンツに到達します。 ご覧のとおり、各ユーザーに独自のBrowsingSession_Keyを与えて、自分のキャッシュされたコンテンツを取得しようとしています。
私はVaryByCustomを使用しているので、新しいBrowsingSession_Key(Guid)をそのユーザーに割り当ててキャッシュをすばやく無効にできます。キャッシュされていないページのコピーを取得できます。
ここで何が問題になっていますか? 私のテストから、GetVaryByCustomStringと同じように、Initializeが呼ばれることが多い場所で呼び出されることが多いようです。しかし、私は複数のユーザーとしてデバッグを実行することはできませんので、なぜ同じGuidと同じ出力キャッシュを取得しているのか分かりません。