首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持缓存VirtualPathProvider服务内容的StaticFileHandler

支持缓存VirtualPathProvider服务内容的StaticFileHandler
EN

Stack Overflow用户
提问于 2013-03-30 11:06:01
回答 2查看 1K关注 0票数 3

我有一个可重用的局部视图、脚本和图像的库,它们嵌入到汇编中并在项目之间共享。

一切正常,我已经修改了web.config,使所有必要的文件类型都由System.Web.StaticFileHandler提供,但不幸的是,它使用Cache-Control: private为所有资源提供服务。

我可以编写自己的StaticFileHandler,为VPP内容提供缓存控制:公共和过期日期。

如何使用VirtualPathProvider.GetCacheDependency实现缓存支持?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-06 00:06:04

基于我的研究,我找到了一种实现缓存的简单方法。

在VPP实现中,您应该实现自己的VirtualFile类,扩展System.Web.Hosting.VirtualFile基类。如果需要从VPP读取文件,它只需要一个流来读取文件。在该阶段,您可以注入标头,甚至更改资源的可缓存性。因为在以前,如果我从VPP请求一个静态文件,它会带有一个头Cache-Control:private。实际上,服务器是这样说的:我不关心你的本地缓存,etags等等。我决定你是否应该缓存它。下面的代码将其更改为public并添加所需的电子标签标头,以便它应保留在缓存中,除非更改该程序集:

代码语言:javascript
复制
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();
    }
}

Special thanks for the commentor :)

票数 3
EN

Stack Overflow用户

发布于 2013-05-01 03:20:46

我弄明白了为什么会这样。我查看了StaticFileHandler的源代码。对于嵌入式文件,它不设置任何缓存头。它只对文件系统中的文件起作用。这意味着这永远不会正常工作。

您有两个选择。

1.找到另一个http处理程序。我从来没有用过这个,但在我的搜索中它出现了:https://code.google.com/p/talifun-web/wiki/StaticFileHandler

2.创建一个http模块,该模块检查是否使用了静态文件处理程序,如果使用了,则设置缓存详细信息。

祝好运。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15714490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档