如何强制IIS 7 不缓存特定页面的图像?
答案 0 :(得分:5)
我原以为是你的浏览器正在进行缓存。
无论如何,只要您的链接未在html中静态声明,就可以在图片的末尾附加一个随机数:
<img src="http://mywebsite/images/mypic.png?a=123456" />
这个论点没有任何意义,因为你对它没有任何作用,但是对于浏览器它看起来像一个新的未缓存的链接。
如何将该随机数放在最后由您决定:
<img src="javascript:getMyLink();" />
或来自后面的代码:
Image myImage = new Image();
myImage.Source = "myurl?a=" + Guid.NewGuid().ToString();
someOtherControl.Controls.Add(myImage);
(当然这是伪代码,您需要检查属性名称是否正确)。
答案 1 :(得分:5)
在IIS7中,您可以在web.config中以声明方式或以编程方式执行此操作。
<location path="YourPath">
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache" />
</staticContent>
</system.webServer>
</location>
程序化解决方案需要一个简单的HttpModule,它已注册为集成模式下的所有请求运行,您可以在其中查找您关注的URL。然后致电:
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
FWIW,您可能想要考虑仅使用HttpCacheability.ServerAndNoCache
启用服务器端缓存来禁用客户端缓存。此外,如果在图像名称上添加查询字符串,则将阻止http.sys进行服务器端缓存。
如果有帮助,我会在书中详细介绍这些技巧:Ultra-Fast ASP.NET。
答案 2 :(得分:1)
我必须处理这个问题,但我需要更好地理解你的最终目标,因为如果服务器上的图像被更改,IIS7将更新它的缓存,所以你可能看到的是浏览器缓存,对吧看着etags?
旧的后退是在图像路径的末尾粘贴一个随机查询字符串,这会让浏览器猜测。
阻止缓存的一种可靠方法是为.gif,.jpg,.png扩展(查找iHttpHandler)创建自定义文件处理程序(代码低于http://www.codeguru.com/csharp/csharp/cs_network/http/article.php/c12641/
using System.IO;
using System.Web;
using System.Globalization;
namespace MVPHacks
{
public class ImageHandler: IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext ctx)
{
HttpRequest req = ctx.Request;
string path = req.PhysicalPath;
string extension = null;
string contentType = null;
extension = Path.GetExtension(path).ToLower();
switch (extension)
{
case ".gif":
contentType = "image/gif";
break;
case ".jpg":
contentType = "image/jpeg";
break;
case ".png":
contentType = "image/png";
break;
default:
throw new NotSupportedException("Unrecognized image type.");
} if (!File.Exists (path))
{
ctx.Response.Status = "Image not found";
ctx.Response.StatusCode = 404;
}
else
{
ctx.Response.StatusCode = 200;
ctx.Response.ContentType = contentType;
ctx.Response.WriteFile (path);
}
}
public bool IsReusable { get {return true; } }
}
}
不要忘记删除默认的图像处理程序,并在web.config
的两个部分中添加<httpHandlers>
<clear />
<add verb="*" path="*.jpg" type="MVPHacks.ImageHandler" />
<add verb="*" path="*.gif" type="MVPHacks.ImageHandler" />
<add verb="*" path="*.png" type="MVPHacks.ImageHandler" />
</httpHandlers>
<handlers>
<clear />
<add verb="*" path="*.png" type="MVPHacks.ImageHandler" name="png" />
<add verb="*" path="*.gif" type="MVPHacks.ImageHandler" name="gif" />
<add verb="*" path="*.jpg" type="MVPHacks.ImageHandler" name="jpg />
</handlers>