ASP.NET: как принудительно перезагрузить веб-статический файл - PullRequest
3 голосов
/ 14 июля 2010

При работе с веб-страницами клиент / браузер решает, обновлять ли он файл, такой как изображение, или .css или .js, или он берет его из кэша.

В случае страницы .aspx решает сервер.

Конечно, на уровне IIS или также используя некоторые методы HttpModule, я могу изменить заголовки запросов, чтобы сообщить клиенту, если и как долго файл должен кэшироваться.

Теперь у меня есть веб-сайт, на котором .aspx идет рука об руку с соответствующим .js. Так что, возможно, у меня есть некоторый код jQuery в .js, который обращается к элементу в .aspx. Если я удалю этот элемент из .aspx, я также адаптирую .js. Если пользователь перейдет на мою страницу, он получит новый .aspx, но он все равно может получить старый .js, что приведет к забавным эффектам.

Мой сайт использует много скриптов и много изображений. По причинам производительности я настроил в IIS, что эти файлы "никогда" не истекает.

Теперь время от времени файл ДОЛЖЕН изменяться, и я хочу убедиться, что пользователи получают файлы обновлений.

В начале я помог себе, переименовав файлы. Итак, у меня были SkriptV1.js и SkriptV2.js и так далее. Это самый плохой вариант, поскольку история репозитория не работает, и мне нужно адаптировать и ссылки, и имя файла.

Теперь я улучшился и изменил только ссылки, используя Skript.js? V = 1 или Skript.js? V = 2. Это заставляет клиента обновлять файлы. Это отлично работает, но все же я должен адаптировать ссылки.

Теперь здесь есть еще одно улучшение:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>

Итак, «GetScriptLastModified» добавит параметр? V = следующим образом:

protected string GetScriptLastModified(string FileName)
{
    string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
    return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}

Итак, отрендеренный .js-Link будет выглядеть для клиента так:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>

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

Теперь два вопроса: а) Есть ли более элегантный способ добиться этого? б) Если нет: кто-нибудь догадывается, насколько велика будет нагрузка на сервер? На одной странице может быть до 50 версионных элементов, поэтому для одного .aspx GetScriptLastModified будет вызываться 50 раз.

С нетерпением жду обсуждения:)

1 Ответ

0 голосов
/ 15 апреля 2012

Существует несколько разных ответов на этот вопрос.

Прежде всего, если у вас есть файлы, которые изменяются только время от времени, установите для заголовков Expires и Cache-Control срок действия в течение одного года.Только если срок действия файлов никогда не истекает, вы можете сказать, что они никогда не истекают.Вы видите проблемы с высказыванием «никогда не истекает» прямо сейчас.

Кроме того, если у вас возникают проблемы с производительностью на вашем сайте из-за обработки большого количества изображений и JavaScript, общепринятым решением является использование CDN.Сеть доставки контента.Есть много разных провайдеров, и я уверен, что вы можете найти тот, который соответствует вашему бюджету.Вы также сэкономите деньги в долгосрочной перспективе, так как CDN будет загружать много I / O и процессорного времени из IIS.Поразительно, насколько велико это может измениться.

Наконец, один из способов убедиться, что пользователи получают последние версии для ваших файлов, которые почти никогда не меняются, - это реализовать какую-то схему управления версиями в URL-адресах ваших ресурсов, чтобысделать кеш очистки.Есть много разных способов сделать это, но один (очень наивный) способ сделать это - иметь номер версии, который увеличивается при каждом развертывании на вашем сайте.

Например, все URL-адреса ваших активов будут выглядеть так: /static/123/img/dog_and_pony.jpg

Затем, при следующем развертывании на своем сайте вы увеличите номер версии, так что он будет равен».Вам понадобится какой-то способ отслеживать версию, динамически вставляя ее в URL-адреса ресурсов, а также следя за тем, чтобы номер версии менялся при каждом развертывании.Идея состоит в том, что все, что ссылается на этот ресурс, должно автоматически знать номер новой версии.

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

Надеюсь, это поможет.

...