私の調査に基づいて、キャッシングを実現するハックな方法を見つけました。
VPP 実装では、基本クラスVirtualFile
を拡張して独自のクラスを実装する必要があります。System.Web.Hosting.VirtualFile
VPP から必要な場合は、ストリームがファイルを読み取ることを期待しています。その段階で、ヘッダーを挿入したり、リソースのキャッシュ可能性を変更したりできます。以前は、VPP から静的ファイルを要求すると、ヘッダーが付いていたからCache-Control:private
です。実際、サーバーは次のように言っていました。ローカル キャッシュや etag などは気にしません。キャッシュするかどうかは私が決めます。以下のコードpublic
は、アセンブリが変更されない限りキャッシュに残るように、必要な e-tag ヘッダーを変更して追加します。
class EmbeddedResourceVirtualFile : VirtualFile
{
readonly EmbeddedResource embedded;
public EmbeddedResourceVirtualFile(string virtualPath, EmbeddedResource embedded)
: base(virtualPath)
{
this.embedded = embedded;
}
public override Stream Open()
{
var assemblyLastModified = embedded.AssemblyLastModified;
var etag = assemblyLastModified.Ticks;
var response = HttpContext.Current.Response;
var cache = response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetETag(etag.ToString());
cache.SetLastModified(assemblyLastModified);
cache.SetExpires(assemblyLastModified.AddYears(2));
return embedded.GetStream();
}
}
コメンターに感謝します:)