... или как я научился не беспокоиться и просто писать код для полностью недокументированных API от Microsoft . Есть ли актуальная документация официального System.Web.Optimization
релиза? Потому что я точно не могу их найти, нет XML-документов, и все сообщения в блоге относятся к RC API, который существенно отличается. Anyhoo ..
Я пишу код для автоматического разрешения зависимостей javascript и создаю пакеты на лету из этих зависимостей. Все работает отлично, за исключением случаев, когда вы редактируете сценарии или иным образом вносите изменения, которые могут повлиять на пакет, без перезапуска приложения, изменения не будут отражены. Поэтому я добавил возможность отключить кеширование зависимостей для использования в разработке.
Однако очевидно BundleTables
кэширует URL-адрес, даже если коллекция пакетов изменилась . Например, в моем собственном коде, когда я хочу воссоздать пакет, я делаю что-то вроде этого:
// remove an existing bundle
BundleTable.Bundles.Remove(BundleTable.Bundles.GetBundleFor(bundleAlias));
// recreate it.
var bundle = new ScriptBundle(bundleAlias);
// dependencies is a collection of objects representing scripts,
// this creates a new bundle from that list.
foreach (var item in dependencies)
{
bundle.Include(item.Path);
}
// add the new bundle to the collection
BundleTable.Bundles.Add(bundle);
// bundleAlias is the same alias used previously to create the bundle,
// like "~/mybundle1"
var bundleUrl = BundleTable.Bundles.ResolveBundleUrl(bundleAlias);
// returns something like "/mybundle1?v=hzBkDmqVAC8R_Nme4OYZ5qoq5fLBIhAGguKa28lYLfQ1"
Всякий раз, когда я удаляю и воссоздаю пакет с тем же псевдонимом , абсолютно ничего не происходит: bundleUrl
возвращаемый результат ResolveBundleUrl
тот же, что и до удаления и воссоздания пакета. Под «таким же» я подразумеваю, что хэш содержимого не изменяется, чтобы отражать новое содержимое пакета.
редактировать ... на самом деле, все намного хуже. Сам пакет каким-то образом кэшируется вне Bundles
коллекции. Если я просто сгенерирую свой собственный случайный хэш, чтобы браузер не кэшировал сценарий, ASP.NET вернет старый сценарий . Таким образом, очевидно, что удаление пакета на BundleTable.Bundles
самом деле ничего не дает.
Я могу просто изменить псевдоним, чтобы обойти эту проблему, и это нормально для разработки, но мне не нравится эта идея, поскольку это означает, что либо мне придется отказаться от псевдонимов после каждой загрузки страницы, либо иметь BundleCollection, размер которой увеличивается на каждая загрузка страницы. Если вы оставите это в производственной среде, это будет катастрофа.
Таким образом, кажется, что когда сценарий обслуживается, он кэшируется независимо от фактического BundleTables.Bundles
объекта. Поэтому, если вы повторно используете URL-адрес, даже если вы удалили связку, на которую он ссылался, прежде чем повторно использовать его, он отвечает тем, что находится в его кеше, и изменение Bundles
объекта не очищает кеш, поэтому только новые элементы (или скорее, новые предметы с другим названием) будут когда-либо использоваться.
Поведение кажется странным ... удаление чего-либо из коллекции должно удалить это из кеша. Но это не так. Должен быть способ очистить этот кеш и заставить его использовать текущее содержимое BundleCollection
вместо того, что было кэшировано при первом доступе к этому пакету.
Есть идеи, как бы я это сделал?
Есть ResetAll
метод, цель которого неизвестна, но он все равно ломает вещи, так что это не так.