... або як я навчився перестати хвилюватися і просто писати код на повністю недокументовані 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
метод, який має невідому мету, але він у будь-якому випадку просто ламає речі, так що це не так.