我有一个在Azure AppService上托管的ASP.NET MVC网站,我正在尝试在客户端启用动态图像的缓存(在Controller#File()方法的帮助下提供)。我用了一些技巧来实现这个目标:
将基于查询字符串的网址转换为“经典”网址,例如
/file/i/Supplier/Logo/fed88a06-1157-4bbb-826d-365bdd8c89eb/png/cng.png
我正在使用IIS Rewrite模块将其转换回基于查询字符串的URL。
在返回图像的操作方法中添加了以下属性:
[OutputCache(Duration = 31536000, Location = System.Web.UI.OutputCacheLocation.ServerAndClient)]
//31536000 seconds represent one year
它适用于除Safari 10和iOS 10之外的所有Web浏览器。在Sarafi 9,8,7,iOS 8.3.3,Chrome,Edge,Firefox中可以很好地缓存图像,但在Safari 10中,它们几乎永远不会被缓存(在iOS 10上也是如此,但它并不重要)。这种情况可以在两台物理Mac笔记本电脑以及BrowserStack上的Mac VM上重现。 Safari中的缓存不已禁用。
Apple的最新网络浏览器是否有任何特殊之处,他们没有按预期缓存资源?或者,我做错了什么?
我不知道如何在Safari中查看请求和响应标头(是否可以?)但在Chrome中,请求和响应标头如下所示。
为清楚起见,我删除了Host,Referrer和Cookie标头。
第一次运行
请求
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6,sr;q=0.4
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Pragma:no-cache
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
响应的
Cache-Control:private, max-age=31533495
Content-Length:32300
Content-Type:image/png
Date:Mon, 17 Oct 2016 14:58:59 GMT
Expires:Tue, 17 Oct 2017 14:17:13 GMT
Last-Modified:Mon, 17 Oct 2016 14:17:13 GMT
Vary:*
X-Frame-Options:SAMEORIGIN
第二次运行
请求
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6,sr;q=0.4
Connection:keep-alive
DNT:1
If-Modified-Since:Mon, 17 Oct 2016 14:17:12 GMT
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
响应的
Request URL:http://******/file/i/Supplier/Logo/1f70c0ac-309c-4629-9186-6ee1b3700d3e/png/crown-logo.png
Request Method:GET
Status Code:304 Not Modified
Cache-Control:private, max-age=31533237
Date:Mon, 17 Oct 2016 15:03:15 GMT
Expires:Tue, 17 Oct 2017 14:17:12 GMT
Last-Modified:Mon, 17 Oct 2016 14:17:12 GMT
Vary:*
X-Frame-Options:SAMEORIGIN