2017-11-13 13 views
0

イントラネット設定で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と同じ出力キャッシュを取得しているのか分かりません。

答えて

0

アプリケーションレベルの変数は、一時的であってもユーザーごとの情報を格納するのに適していません。

最後に、保存されたGUIDを持つクッキーを使用してスワップし、クッキーを無効にします(GUIDをリセットするか、&を再作成してください)。これは、Cookieに格納された情報を代わりに処理するGetVaryByCustomStringを使用して、複数のユーザーがサイトを使用できるようにしたことを意味していました。

これは私にとってはうまくいきますが、ユーザーがクッキーを入れ替える可能性を考慮する必要があるため、暗号化のオプションについて詳しく説明します。 今のところ答えは - アプリケーションレベルの変数をこのように使用しないでください。そのようなタスクには適していません。

関連する問題