IIS 7 Force Fresh Images - PullRequest
       19

IIS 7 Force Fresh Images

4 голосов
/ 19 декабря 2009

Как заставить IIS 7 не кэшировать изображения для конкретной страницы?

Ответы [ 3 ]

5 голосов
/ 19 декабря 2009

Я бы подумал, что ваш браузер выполняет кеширование.

В любом случае одним из способов решения этой проблемы, если ваша ссылка не объявлена ​​статически в html, является добавление случайного числа в конец URL-адреса изображений:

<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);

(конечно, это псевдокод, вам нужно проверить правильность имен свойств).

5 голосов
/ 19 декабря 2009

В 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.

Если это поможет, я подробно расскажу о таких приемах в своей книге: Сверхбыстрый ASP.NET .

1 голос
/ 19 декабря 2009

Мне пришлось много с этим справляться, но мне нужно лучше понять вашу конечную цель, поскольку IIS7 обновит свой кеш, если изображение будет изменено на сервере, поэтому, возможно, вы видите кеш браузера, не так ли? смотрел в etags?

Старый запасной вариант - вставлять случайную строку запроса в конец пути к изображению, что позволяет браузеру угадывать.

Одним из надежных способов предотвратить его кэширование является создание собственного обработчика файлов для расширений .gif, .jpg, .png (lookup 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>
...