[ CompressFilter ]をドーナツキャッシングで動作させようとしていますが、問題が発生しています。
ドーナツだけでなく、ページ全体がキャッシュされます。CompressFilter
私が使用しているソースは以下のとおりです。特定のActionResultサブクラスのキャッシュを回避するために結果のタイプにアクセスする必要があったため、これを元のソースOnResultExecuted
から代わりに使用するように変更しました。OnActionExecuting()
実際のMVCv1ソースコードをOutputCacheAttribute
見ると、それも使用しているように見えOnResultExecuted()
ますが、事実が直接競合を引き起こしているとは思いません。
置換キャッシングがどのように機能するかについては、なぜそのように動作するのかを理解するのに十分な知識がありません。これは、いかなる種類の破損した表示にもならないということは注目に値することだと思います。ドーナツがないように振る舞います!
キャッシングを処理するには、ある種のIIの「プラグイン」を使用する必要があるように見えます。これは、実際には避けたかったのですが、ドーナツキャッシングも必要なようです。
私は実際、なぜそれがこの効果をもたらすのかを知りたいと思っていますが、可能であれば解決策も素晴らしいでしょう。
public class CompressFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
// dont encode images!
if (filterContext.Result is ImageResult)
{
return;
}
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}