我有一个可重用的局部视图、脚本和图像的库,它们嵌入到汇编中并在项目之间共享。
一切正常,我已经修改了web.config,使所有必要的文件类型都由System.Web.StaticFileHandler提供,但不幸的是,它使用Cache-Control: private为所有资源提供服务。
我可以编写自己的StaticFileHandler,为VPP内容提供缓存控制:公共和过期日期。
如何使用VirtualPathProvider.GetCacheDependency实现缓存支持?
发布于 2016-05-06 00:06:04
基于我的研究,我找到了一种实现缓存的简单方法。
在VPP实现中,您应该实现自己的VirtualFile类,扩展System.Web.Hosting.VirtualFile基类。如果需要从VPP读取文件,它只需要一个流来读取文件。在该阶段,您可以注入标头,甚至更改资源的可缓存性。因为在以前,如果我从VPP请求一个静态文件,它会带有一个头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();
}
}发布于 2013-05-01 03:20:46
我弄明白了为什么会这样。我查看了StaticFileHandler的源代码。对于嵌入式文件,它不设置任何缓存头。它只对文件系统中的文件起作用。这意味着这永远不会正常工作。
您有两个选择。
1.找到另一个http处理程序。我从来没有用过这个,但在我的搜索中它出现了:https://code.google.com/p/talifun-web/wiki/StaticFileHandler
2.创建一个http模块,该模块检查是否使用了静态文件处理程序,如果使用了,则设置缓存详细信息。
祝好运。
https://stackoverflow.com/questions/15714490
复制相似问题