Как сообщить браузерам, что файлы были обновлены? ASP.NET MVC - PullRequest
0 голосов
/ 10 июня 2010

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 июня 2010

Самое простое - добавить дату или номер версии в 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-updated хороши, но не решают проблему "сообщения" браузеру о наличии новой версии файла.

1 голос
/ 10 июня 2010

Это то, для чего предназначены ETag , If-None-Match (или If-Not-Modified) и HTTP 304.

Если файл отправляется с заголовком 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"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...