1

ASP.Net または Composite C1 CMS での outputcache の動作に関して、次の質問があります (どこに問題があるのか​​わかりません)。

「City」という名前の Cookie でキャッシュを変更する必要があります。Global.asax では、GetVaryByCustomString メソッドをオーバーライドしました。

public override string GetVaryByCustomString(HttpContext context, string custom)
{
   var result = ApplicationLevelEventHandlers.GetVaryByCustomString(context, custom);

   if (result == null) {
      return base.GetVaryByCustomString(context, custom);
   }

   HttpCookie cookie = context.Request.Cookies["City"];
   string additionalVary = "";
   if (cookie != null)
      additionalVary = cookie.Value;
   else
      additionalVary = "Москва";

   return String.Concat(result, additionalVary);
}

そして問題は: オーバーライドされた GetVaryByCustomString メソッドのブレークポイントは、ページへの最初のリクエストでのみヒットしますが、キャッシュが実際に期限切れになるまで (私の場合は 60 秒)、次のリクエストではヒットしません。その 60 秒間にクライアント側で Cookie が変更された可能性がありますが、ページは単にキャッシュから取得されます。

どこが間違っていますか?前もって感謝します。

更新: CacheProfile 設定の次の変更により、最終的に出力キャッシュを Cookie ごとに変更することができました。

<outputCacheProfiles>
   <add name="C1Page" duration="60" varyByCustom="C1Page" varyByParam="*" varyByHeader="Cookie" location="Server" />
</outputCacheProfiles>

この場合、メソッド GetVaryByCustomString は各リクエストでヒットしていますが、その必要はありません。これらの設定により、Web サイトに設定されている可能性のあるすべての Cookie によってキャッシュが異なります。もちろん、これは望ましい動作ではありません。そのため、調査を続けています。

さらに面白いことに、これら 2 つのパラメーター (varyByHeader="Cookie" と location="Server") は一緒にしか機能せず、そのうちの 1 つを無効にすると、以前とまったく同じように見えます - outputcache は変化しません。

4

1 に答える 1

0

Application_BeginRequest にブレーク ポイントを設定してみてください。ブラウザがリクエストを行っているのではなく、キャッシュされたページを表示している可能性があります。

于 2013-03-06T11:58:24.230 に答える