特定のページに、クライアント用に 10 分間、サーバー用に 24 時間のキャッシュを持たせたいと考えています。その理由は、ページが変更された場合、クライアントは 10 分以内に更新されたバージョンをフェッチしますが、何も変更されない場合、サーバーは 1 日に 1 回ページを再構築するだけで済みます。
問題は、出力キャッシュの設定がクライアントの設定を上書きしているように見えることです。これが私がセットアップしたものです:
カスタム ActionFilterAttribute クラス
public class ClientCacheAttribute : ActionFilterAttribute
{
private bool _noClientCache;
public int ExpireMinutes { get; set; }
public ClientCacheAttribute(bool noClientCache)
{
_noClientCache = noClientCache;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (_noClientCache || ExpireMinutes <= 0)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
}
else
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(ExpireMinutes));
}
base.OnResultExecuting(filterContext);
}
}
ウェブ設定の設定
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache24Hours" location="Server" duration="86400" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
私はそれをどのように呼んでいますか:
[OutputCache(CacheProfile = "Cache24Hours")]
[ClientCacheAttribute(false, ExpireMinutes = 10)]
public class HomeController : Controller
{
[...]
}
しかし、HTTP ヘッダーを見ると、次のように表示されます。
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
どうすればこれを適切に実装できますか? ASP.NET MVC 4 アプリケーションです。