ASP.NET: как принудительно перезагрузить веб-статический файл
При работе с веб-страницами клиент / браузер решает, обновлять ли он файл, такой как изображение, или.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 ответ
Есть несколько разных ответов на этот вопрос.
Прежде всего, если у вас есть файлы, которые изменяются только время от времени, установите срок действия заголовков Expires и Cache-Control, чтобы они истекали через один год. Только если срок действия файлов действительно не истекает, вы можете сказать, что они никогда не истекают. Вы видите проблемы с высказыванием "никогда не истекает" прямо сейчас.
Кроме того, если на вашем сайте возникают проблемы с производительностью при обработке большого количества изображений и JavaScript, общепринятым решением является использование CDN (Content Delivery Network). Есть много разных провайдеров, и я уверен, что вы можете найти тот, который соответствует вашему бюджету. Вы также сэкономите деньги в долгосрочной перспективе, так как CDN будет загружать много I/O и процессорного времени из IIS. Поразительно, насколько велика может быть разница.
Наконец, один из способов убедиться, что пользователи получают последние версии ваших файлов, которые почти никогда не меняются, - это внедрить какую-то схему управления версиями в URL-адресах ваших ресурсов, чтобы обеспечить очистку кэша. Есть много разных способов сделать это, но один (очень наивный) способ сделать это - иметь номер версии, который увеличивается при каждом развертывании на вашем сайте.
Например, все ваши URL-адреса активов будут выглядеть как /static/123/img/dog_and_pony.jpg
Затем, при следующем развертывании на своем сайте, вы увеличиваете номер версии до "124". Вам понадобится какой-то способ отслеживать версию, динамически вставляя ее в URL-адреса ресурсов, а также следя за тем, чтобы номер версии менялся при каждом развертывании. Идея состоит в том, что все, что ссылается на этот ресурс, должно автоматически знать новый номер версии.
С точки зрения производительности, это замечательная цель, чтобы пользователь никогда не обновлялся и не загружал одно и то же дважды. Но иногда это намного меньше хлопот, и если пользователи только обновляют все периодически, это, вероятно, хорошо для большинства веб-сайтов.
Надеюсь это поможет.