我正在尝试做一些我认为相当简单的事情.获取IIS 7告诉客户他们可以在我的网站上缓存所有图像一段时间,比方说24小时.
我已尝试过http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx上的步骤,但无济于事.我仍然得到返回304s的服务器请求.
有没有人有办法做到这一点?我有一个图形密集型网站,每次他们请求页面时我的用户都被锤击(我的服务器也是如此).很奇怪,这些图像似乎在Firebug中出现了"Cache-Control private,max-age = 3600",但是当我按下F5时,浏览器仍在请求它们.
关于利用浏览器缓存有几个问题,但我没有找到任何有助于在ASP.NET应用程序中执行此操作的内容.谷歌的Pagespeed告诉这是性能最大的问题.到目前为止,我在我的web.config中这样做了:
<system.webServer>
<staticContent>
<!--<clientCache cacheControlMode="UseExpires"
httpExpires="Fri, 24 Jan 2014 03:14:07 GMT" /> -->
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.24:00:00" />
</staticContent>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
评论代码有效.我可以将expire header设置为将来某个特定时间,但我无法设置cacheControlMaxAge从现在开始静态内容的缓存天数.这是行不通的.我的问题是:
我怎样才能做到这一点?我知道有可能只为特定的文件夹设置缓存,这是一个很好的解决方案,但它也不起作用.应用程序托管在Windows Server 2012上,在IIS8上,应用程序池设置为经典.
在web配置中设置此代码后,我的页面速度为72(之前为71).没有缓存50个文件.(现在49)我想知道为什么,我只是意识到一个文件实际上是缓存的(svg文件).不幸的是png和jpg文件没有.这是我的web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="exceptionManagement" type="Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManagerSectionHandler,Microsoft.ApplicationBlocks.ExceptionManagement" />
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E34" requirePermission="false" allowDefinition="Everywhere" />
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
</configSections>
<exceptionManagement mode="off">
<publisher …Run Code Online (Sandbox Code Playgroud) 有没有办法在我的ASP.NET应用程序中缓存单个javascript文件的缓存而不禁用应用程序中任何其他文件的缓存?
它在Azure中的IIS 7上运行,所以对我而言,我唯一的控制它的选项是在webserver标签内.
我目前使用folowwing配置,但这是禁用所有文件的缓存.
<modules runAllManagedModulesForAllRequests="true"/>
<staticContent>
<clientCache cacheControlMode="DisableCache"/>
</staticContent>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我只是想禁用一个经常更改的单个javascript文件的缓存.
可能吗?
将项目移动到生产服务器后,我发现静态文件(如图像)不会返回状态为"304 not modified",尽管有"Last-Modified"和"Expires"等缓存标题.
请求标题
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2
Cache-Control:max-age=0
Connection:keep-alive
Cookie:_LANG=ru
DNT:1
Host:test.com
If-Modified-Since:Mon, 07 Sep 2015 08:46:37 GMT
If-None-Match:"1D0E949B4DCD480"
Referer:http://test.com/ru/Some/Index/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
响应标头
HTTP/1.1 200 OK
Cache-Control: public
Content-Type: image/png
Expires: Tue, 08 Sep 2015 14:33:06 GMT
Last-Modified: Mon, 07 Sep 2015 08:46:37 GMT
Accept-Ranges: bytes
ETag: "1D0E949B4DCD480"
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 07 Sep 2015 14:33:06 GMT
Content-Length: 5953
Run Code Online (Sandbox Code Playgroud)
在本地"IIS快递"一切正常.
本地响应标头
HTTP/1.1 304 Not Modified …Run Code Online (Sandbox Code Playgroud) 我一直在阅读web.config文件中的staticContent元素,但我在确定ASP.Net究竟认为静态内容时遇到了一些麻烦.我假设它将包括图像,js文件,CSS和静态html文件,但我似乎找不到任何明确说明这一点的文章.有没有人有文档链接详细解释这个?
如何确保缓存静态内容(图像,css,javascript)?什么是最好的方法?
我有一个带有iframe的页面,显示了一个外部页面.外部页面配置为从我的服务器下载CSS文件.
在CSS中,我添加了一个@font-face选择器:
@font-face {
font-family: "Special Font";
src: url("<%= Request.Url.GetLeftPart(UriPartial.Authority) + "/fonts/specialfont.ttf" %>");
}
Run Code Online (Sandbox Code Playgroud)
这会在Chrome中下载并显示字体,但在Firefox中,它会下载字体,但拒绝使用它.进行一些研究表明,这个问题是一个跨领域的政策问题.这里提到的解决方案之一:
是启用CORS头.但是,它提供的解决方案是在整个网站范围内:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
而我只想为.TTF文件启用它.有没有办法通过使用HttpHandler或其他方法来做到这一点?
我在Windows Server IIS Web服务器上有一个PDF,用户在其中使用IE8 / 9/10使用HTTP调用来请求它,像这样...
http: // mydomain.com / somefolder / myFile.pdf
Run Code Online (Sandbox Code Playgroud)
第一次点击将下载文件没有问题。 问题:如果管理员更新了PDF,并且用户返回以重新加载它,则IE仅显示本地缓存的版本,而不会从服务器请求新版本。
我已经确认,根据第二个请求,IE8,IE9和IE10根本不会为PDF文件调用服务器。甚至没有条件请求(例如,if-updated-since)。使用Fiddler和WireShark确认了这一点。但是我从来没有用Max-Age或任何东西来明确设置缓存。我没有为该文件夹设置缓存。我不希望将缓存设置为“立即过期”。它也针对Word DOC。
Internet Explorer中是否存在一个错误,使其无论何时都始终使用静态文档(例如PDF,DOC)的本地副本?
这些想法不起作用:
F5,CTRL+ F5,SHIFT+F5
使用DELETE HISTORY按钮删除浏览器历史记录并缓存。为什么这实际上不能清除所有缓存,这超出了我的范围。除密码外,我已选择删除所有内容。
我唯一了解的方法是:
手动删除本地PDF,因为“删除历史记录”按钮不会删除本地版本。但是大多数用户并不那么精明。
使用Firefox,但这不是公司认可的浏览器。不要让我开始。
将服务器缓存设置为“立即过期”,但是pdf包含在带有网页的文件夹中,我不希望这样做。我想将缓存最长期限用于CSS,脚本,图像等其他内容。
在末尾添加一个伪查询字符串(如?id = 1),该方法有效,但是业务线中有100多个文档,每个文档中的链接都必须更新。
使用FIDDLER“清除缓存”按钮或CCleaner,但我公司中的大多数用户(7万名员工)不是开发人员,也没有该软件。
是否有一个真正的解决方案,以使IE像我想的那样工作?
我们的应用程序是使用 angular-cli(版本:7.0.2)和 angular(版本:7.0.0)开发的。我们的图像文件很少,pdf 保存在资产文件夹中。每 3 个月发布一次应用程序的每个版本,这些文件都会发生变化。
我通读了此链接中提到的各种技术:使用同一网址中的新图片刷新图片
不确定哪个是最好的解决方案。任何关于如何实现缓存破坏的建议/代码片段表示赞赏。
我正在Intranet上工作,并且使用IE可以打开本地Office安装的文档存在一些问题。
我使用以下锚标记为用户提供文件:
<a target="_blank" download="{{fileName}}" href="{{filePath}}">
Run Code Online (Sandbox Code Playgroud)
当用户单击此链接时,IE会为用户提供打开或保存它的决定。如果用户选择打开文件,然后决定他/她想要编辑文件,则他们在Office应用程序顶部单击“启用编辑”。这给用户一个错误,因为Office应用程序无法连接到站点并获取用户要编辑的文件。
Office应用程序名称无法连接到(我的文件)...
我要做的是让用户编辑他们在网上找到的文档的副本。然后他们可以保存副本,然后重新上传。
我认为问题之一是文件受登录保护。也许Intranet正在SSL上运行。
在研究问题的解决方案时,我从Microsoft找到了此支持页面,该页面讨论了我正在经历的事情。他们在错误消息三中写道:
Office应用程序名称无法打开文件。
就我而言,我得到的信息是:
Office应用程序名称无法连接到(我的文件)...
几乎相同,Microsoft写道,一个问题可能是:
当Internet Explorer通过SSL与安全网站通信时,Internet Explorer会强制执行任何无缓存请求。如果存在一个或多个标题,则Internet Explorer不会缓存该文件。因此,Office无法打开该文件。
这让我开始思考,然后我开始研究此问题,找到StackOverflow页面,例如“如何为每个文件夹配置静态内容缓存...”和“利用IIS中的浏览器缓存”。我还检查了《 IIS.net配置参考》,以查看此处是否有任何可以帮助我解决问题的内容。
我认为主要的问题是,打开文件时,该文件未保存在本地,因此Office应用程序无法对其进行编辑。到目前为止,我认为解决此问题的方法是删除无缓存头,而对文件使用某种短缓存,以便浏览器强制下载该文件。
我尝试了链接的前两篇SO文章中的技术,尝试在web.config中设置静态文件的缓存,但是强制缓存没有任何改变(当我询问时,我使用此技术来确保缓存控件正确无误文件)。Office应用程序仍尝试从其无权访问的网页打开文件。
我尝试的另一件事是强制Internet Explorer下载该文件。完全删除该选项以将其打开。Microsoft也有关于它的支持页面。但这似乎没有用。在Global.asax中,我尝试了以下代码(只是看是否可以使Word文件正常工作):
<script runat="server">
void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
Response.Headers.Set("Content-Type", "application/ms-word");
Response.Headers.Set("Content-Disposition", "attachment; filename=fname.ext");
}
</script>
Run Code Online (Sandbox Code Playgroud)
但这只会使Internet Explorer尝试下载我尝试访问的所有页面。
我们总是检查用户是否确实有权访问所请求的文件。我们不希望人们窥探其他文件。禁用此检查将导致所有Office应用程序都可以在用户要编辑文件时打开文件。但这是一个糟糕的解决方案,并且带来了很多安全问题。
所以我的问题是,“如何启用在IE中从受登录保护的Intranet打开的Office文档中进行编辑?” 如果与缓存有关,那么我该如何解决?当用户选择“打开”文件时,是否可以通过某种方式告诉IE保存本地副本,以及如何告诉Office应用程序查找文件的本地缓存版本,而不是尝试从中下载文件?服务器?
我将问题缩小为Office应用程序的身份验证。当我单击Office应用程序中的“启用编辑”按钮时,该应用程序正在尝试下载文件,以便它可以编辑文件。然后,该请求被服务器拒绝(服务404),因为Office应用程序未登录,并且没有任何类型的cookie来告知服务器实际上确实可以访问该文件。这导致用户收到一条消息,通知用户无法打开请求的文件。
我想为我的js,css和html文件设置不同的缓存控制头值.我知道在每个文件夹的基础上设置它的选项,但我的应用程序在同一文件夹中有html和js文件.
它甚至可以在IIS中使用吗?
对于我的网站,Google PageSpeed Insights 建议更改某些可缓存资源的过期值,例如 .css、.js、.svg、google api、siteimprove。为上述文件设置过期值是否可行?如果是,那么需要什么配置?