根据我的研究,我发现了一种实现缓存的 hacky 方法。
在您的 VPP 实现中,您应该实现自己的VirtualFile
类,扩展System.Web.Hosting.VirtualFile
基类。如果 VPP 需要它,它只需要一个流来读取文件。在那个阶段,您可以注入标头甚至更改资源的可缓存性。因为之前,如果我从 VPP 请求一个静态文件,它带有一个 header Cache-Control:private
。实际上,服务器是在说:我不在乎你的本地缓存、etags 等等。我决定你是否应该缓存它。下面的代码将其更改为public
并添加所需的电子标签标头,以便它应该保留在缓存中,除非该程序集被更改:
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();
}
}
特别感谢评论员:)