... или как я научился перестать беспокоиться и просто написать код против полностью недокументированных 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
, такой же, как и до того, как я удалил и воссоздал пакет. Под "тем же" я подразумеваю, что хэш содержимого не изменяется, чтобы отразить новое содержимое пакета.
edit... На самом деле это намного хуже. Сам комплект кэшируется как-то вне коллекции Bundles
. Если я просто создаю свой собственный случайный хэш, чтобы предотвратить кеширование браузера script, ASP.NET возвращает старый script. Таким образом, по-видимому, удаление пакета из BundleTable.Bundles
фактически ничего не делает.
Я могу просто изменить псевдоним, чтобы обойти эту проблему, и это нормально для разработки, но мне эта идея не нравится, поскольку это означает, что я должен отказаться от псевдонимов после каждой загрузки страницы или создать BundleCollection в размере при каждой загрузке страницы. Если вы оставите это в рабочей среде, это будет катастрофой.
Таким образом, кажется, что при обслуживании script он становится кэшированным независимо от фактического объекта BundleTables.Bundles
. Поэтому, если вы повторно используете URL-адрес, даже если вы удалили связанный с ним пакет, который он ссылался, прежде чем повторно использовать его, он отвечает на все в своем кеше, а изменение объекта Bundles
не очищает кеш - так что только новые элементы (или, скорее, новые элементы с другим именем) будут использоваться.
Поведение кажется странным... удаление чего-то из коллекции должно удалить его из кеша. Но это не так. Должен быть способ сбросить этот кеш и использовать его текущее содержимое BundleCollection
вместо того, что он кэшировал, когда этот пакет был первым.
Любая идея, как я это сделаю?
Существует этот ResetAll
метод, который имеет неизвестную цель, но он просто нарушает все, так что это не так.