ОБНОВЛЕНИЕ: Предыдущая версия не работала на Azure, я упростил и исправил ниже.(Обратите внимание, что для работы в режиме разработки с IIS Express вам необходимо установить URL Rewrite 2.0 от Microsoft http://www.iis.net/downloads/microsoft/url-rewrite - он использует установщик WebPi, сначала закройте Visual Studio)
Если вы хотите изменить фактические имена файлов, а не добавлять строку запроса (которая игнорируется некоторыми прокси-серверами / браузерами для статических файлов) Вы можете выполнить следующие шаги: (Я знаю, что это старая запись, но янаткнулся на него при разработке решения:
Как это сделать: Автоматически увеличивать версию сборки при каждом построении проекта и использовать это число дляперенаправленный статический файл на определенные ресурсы, которые вы хотели бы обновлять (так что что-то .js включено как нечто. v1234.js с 1234, автоматически изменяющимся каждый раз при сборке проекта) - я также добавил некоторые дополнительные функции, чтобы гарантировать, что .min.js-файлы используются в производственной среде, а обычные.js-файлы используются при отладке (я использую WebGrease для автоматизациипроцесс минимизации) Одна из приятных особенностей этого решения заключается в том, что оно работает как в локальном / dev-режиме, так и в производственном режиме.(Я использую Visual Studio 2015 / Net 4.6, но я считаю, что это будет работать и в более ранних версиях.
Шаг 1: Включить автоматическое увеличение сборки при сборке В AssemblyInfoФайл .cs (находится в разделе «Свойства» вашего проекта, измените следующие строки:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
на
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
Шаг 2: Настройка URLпереписать в web.config для файлов со слагами встроенной версии (см. шаг 3)
В web.config (основной для проекта) добавьте следующие правила в раздел <system.webServer>
, который я поместил непосредственно после</httpProtocol>
end tag.
<rewrite>
<rules>
<rule name="static-autoversion">
<match url="^(.*)([.]v[0-9]+)([.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
<rule name="static-autoversion-min">
<match url="^(.*)([.]v[0-9]+)([.]min[.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
</rules>
</rewrite>
Шаг 3: Переменные приложения установки для чтения текущей версии сборки и создания слагов версий в файлах js и css.
в Global.asax.cs (находится в корне проекта) добавьте следующий код в защищенный void Application_Start () (после строк Register)
// setup application variables to write versions in razor (including .min extension when not debugging)
string addMin = ".min";
if (System.Diagnostics.Debugger.IsAttached) { addMin = ""; } // don't use minified files when executing locally
Application["JSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.','0') + addMin + ".js";
Application["CSSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.', '0') + addMin + ".css";
Шаг 4: Изменитьссылки SRC в представлениях Razor, используя переменные приложения, которые мыустановить в Global.asax.cs
@HttpContext.Current.Application["CSSVer"]
@HttpContext.Current.Application["JSVer"]
Например, в моем _Layout.cshtml, в моем разделе head, у меня есть следующий блок кода для таблиц стилей:
<!-- Load all stylesheets -->
<link rel='stylesheet' href='https://fontastic.s3.amazonaws.com/8NNKTYdfdJLQS3D4kHqhLT/icons.css' />
<link rel='stylesheet' href='/Content/css/main-small.@HttpContext.Current.Application["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/medium.@HttpContext.Current.Application["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/large.@HttpContext.Current.Application["CSSVer"]' />
@RenderSection("PageCSS", required: false)
Здесь следует отметить пару вещей: 1) в файле нет расширения .2) .min тоже нет.Оба они обрабатываются кодом в Global.asax.cs
Аналогично (также в _Layout.cs) в моем разделе JavaScript: у меня есть следующий код:
<script src="~/Scripts/all3bnd100.min.js" type="text/javascript"></script>
<script src="~/Scripts/ui.@HttpContext.Current.Application["JSVer"]" type="text/javascript"></script>
@RenderSection("scripts", required: false)
Первый файл - это пакет всех моих сторонних библиотек, которые я создал вручную с помощью WebGrease.Если я добавляю или изменяю какие-либо файлы в комплекте (что происходит редко), я вручную переименовываю файл в all3bnd101.min.js, all3bnd102.min.js и т. Д. Этот файл не соответствует обработчику перезаписи, поэтомубудет сохраняться в кэше в клиентском браузере, пока вы не перегруппируете / не измените имя вручную.
Второй файл - ui.js (который будет записан как ui.v12345123.js или ui.v12345123.min.jsв зависимости от того, работаете ли вы в режиме отладки или нет) Это будет обработано / переписано.(вы можете установить точку останова в Application_OnBeginRequest файла Global.asax.cs, чтобы посмотреть, как он работает)
Полное обсуждение этого вопроса: Упрощенное автоматическое управление версиями Javascript / CSS в ASP.NET MVC 5 для остановкипроблемы с кэшированием (работает в Azure и локально) с или без перезаписи URL (включая способ сделать это без перезаписи URL)