【问题标题】:Appcache - how to set right cache headers?Appcache - 如何设置正确的缓存头?
【发布时间】:2015-03-06 12:38:27
【问题描述】:

我创建了一个简单的清单文件,该文件托管在页面上的 iframe 中。

这样做的问题是,清单被正确解析,但文件不是从缓存中获取的。

使用标准缓存头(清单和其中定义的每个文件都有私有缓存控制):

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/cache-manifest; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-UA-Compatible: IE=Edge
Date: Fri, 06 Mar 2015 10:47:28 GMT
Content-Length: 1398

当我第一次访问 IE11/Chrome/Firefox 中的页面时,会触发 appcache 事件并获取所有文件。但是,当我单击指向当前页面的链接的菜单时,在提琴手和浏览器开发工具中我看到,该特定页面的文件是从服务器获取的,而不是从缓存中获取的。

然后我更改清单缓存标头(文件标头与以前相同):

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/cache-manifest; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 06 Mar 2015 11:00:52 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-UA-Compatible: IE=Edge
Date: Fri, 06 Mar 2015 11:00:51 GMT
Content-Length: 1398

在所有浏览器上的结果都是一样的。

当设置了 manifest 的 expires 标头并且我为 manifest 中定义的文件设置了它时,然后在 Firefox 上从 appcache 加载文件,但在对每个页面进行第二次请求之后。当我第一次获取页面时,它们不应该从缓存中加载吗?缓存已加载到其他页面,页面由 window.location.reload 刷新并使用了 swapCache。在每个页面上,清单都由相同的 iframe 加载(它位于主 _Layout.cshtml 上)。

在 Chrome 中的情况类似于 Firefox,但在这个浏览器中,第一次访问每个页面以从缓存中获取图像就足够了(我没有提到我只有图像,而不是 js 或 css 文件清单)。

这一切都很好,但在 IE11 中它不起作用。情况与我帖子开头的情况相同。第一次加载清单中的所有图像,但后来当我加载任何页面时,该页面中的所有图像都会再次从服务器加载,而不是从缓存中加载。这是持久的。

在 IE10 中,我看到这些文件返回了 302 状态代码,但我没有看到它是从 appcache 中获取的。

使用 appcache 应该不会向服务器发出任何请求。

我怎样才能让它在每个浏览器中工作?

调试和正确设置 appcache 真是太疯狂了。

我不想计算我浪费了多少小时来设置当前点,我发现这不是旅程的终点​​。

[编辑]

也许当我将文件发送到浏览器时,我应该以其他方式执行此操作? (返回 304 什么的……)

这是我的 http 处理程序(我在 ASP.NET MVC 中执行此操作,但应该没问题):

public void ProcessRequest(HttpContext context)
    {
        var current = context.Request.CurrentExecutionFilePath;

        string extension = Path.GetExtension(current).ToLower();
        if (extension == ".json")
        {
            context.Response.ContentType = "application/json";
        }
        else if (extension == ".png")
        {
            context.Response.ContentType = "image/png";
        }
        else
        {
            throw new InvalidOperationException("Unsupported file type");
        }

        context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(30));

        var cache = context.Response.Cache;
        cache.SetMaxAge(new TimeSpan(0, 30, 0));


        var serverPath = context.Server.MapPath(current);
        byte[] image = File.ReadAllBytes(serverPath);

        context.Response.BinaryWrite(image);
        //context.Response.End();
    }

【问题讨论】:

    标签: internet-explorer-11 html5-appcache


    【解决方案1】:

    我已经在我的自定义处理程序中实现了 If-Modified-Since 标头的处理,并且看起来它可以正常工作。 另外我添加了一行代码来刷新 iframe 的源代码

    iframe.src = iframe.src
    

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 2014-02-22
      • 2011-10-11
      • 1970-01-01
      • 2021-07-01
      • 2014-11-21
      • 2016-09-13
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多