2010-06-10 4 views
0

У меня есть веб-сайт ASP.NET MVC, размещенный в IIS. Иногда я нажимаю изменения, и браузер пользователя все еще может использовать предыдущие файлы, что вызывает проблемы с функциональностью. Это потому, что браузер кэширует эти файлы правильно? Что я могу сделать, чтобы браузер пользователя загружал обновленные файлы?Как обновить файлы браузеров? ASP.NET MVC

Спасибо!

ответ

1

Проще всего сделать, это добавить дату или номер версии на URL в качестве строки запроса. Что-то вроде:

<link rel="stylesheet" href="http://mysite.com/styles.css?2010-06-10-0700"> 

или

<script type="text/javascript" src="http://mysite.com/js/main.js?v1234"></script> 

Браузер запрашивает новый файл, поскольку URL отличается. Сервер будет игнорировать запрос (если вы не делаете что-то умное).

Предложения, сделанные с помощью etag/last-modified, являются хорошими, но не решают проблему «говоря» браузеру, что есть новая версия файла.

+0

+1: Да, я пропустил сторону отказа от кэша. –

1

Это то, что ETag, If-None-Match (или If-Not-Modified), и HTTP 304 resopnses.

Если файл отправлен с заголовком ETag и допустимой политикой кэширования, браузер будет кэшировать файл, и для каждого последующего запроса будет отправлен заголовок If-None-Match.

Веб-сервер должен проверить, что сгенерированный ETag файла соответствует запросу If-None-Match, и возвращает либо HTTP 200 с новым контентом, либо HTTP 304, указывающий, что кэшированная версия все еще актуальна.

Вот как я, используя его в ASP.NET MVC 1.0:

public ActionResult ViewAvatar(long id) 
{ 
    UserAvatar avatar = this.AppManager.GetUserAvatar(id); 

    if (avatar != null && true) 
    { 
     byte[] imageData = avatar.Avatar.ToArray(); 

     string eTag = LanLordzApplicationManager.CalculateMd5(imageData); 

     if (this.Request.Headers["If-None-Match"] == eTag) 
     { 
      return this.NotModified(
       HttpCacheability.Public, 
       DateTime.Now.AddMinutes(2) 
      ); 
     } 

     string mimeType = this.AppManager.GetImageMimeType(imageData); 

     return this.Image(
      imageData, 
      mimeType, 
      HttpCacheability.Public, 
      DateTime.Now.AddMinutes(2), 
      eTag 
     ); 
    } 
    else 
    { 
     return this.HttpError(404, this.View("NotFound")); 
    } 
} 
+0

Спасибо за ваш ответ. Так что я устанавливаю код состояния ответа в моих обновленных контроллерах? (Извините, не понимая эту вещь ETag) Что делать, если обновленный файл является js или css? – fishiefishie

+0

Ну, файлы .JS и .CSS обычно отправляются веб-сервером напрямую, а не через ASP. Вам нужно будет настроить кешируемость в настройках IIS. То есть вам может потребоваться снизить время кэширования и использовать ETags. –

Смежные вопросы