IIS 7强制新鲜图像

时间:2009-12-18 22:01:12

标签: asp.net iis-7 web-config

如何强制IIS 7 缓存特定页面的图像?

3 个答案:

答案 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>