Новые возможности компоновки ASP.NET. Как я могу программно обновить определенный пакет?
Я работаю с новыми функциями компоновки ASP.NET(используя предварительный выпуск System.Web.Optmization 1.0.0-beta) в своем веб-приложении ASP.NET MVC 3.
Отлично работает.
Однако у нас есть определенный динамический CSS/JS, который хранится в базе данных.
Я хочу, чтобы это добавилось в отдельный комплект для моего основного пакета, скажем, "DynamicBundle". Я знаю, как это сделать, а не проблема.
Теперь мой вопрос: когда этот CSS/JS изменяется в базе данных, этот пакет должен быть "обновлен", чтобы содержимое этих файлов перечитывалось в пакет.
По сути, мне нужно, чтобы ASP.NET повторно создавала магическую директиву/строку, которая добавляется к URL-адресу пакета.
В идеале я бы хотел только обновить конкретный пакет, а не всю таблицу пакетов.
Есть ли способ сделать это?
EDIT:
Хорошо, вторая проблема, не могу понять, как добавить динамический CSS/JS в пакет. bundle.AddFile
принимает виртуальный путь к файлу, но это не физический файл, это строка. Как я собираюсь это сделать? Неужели мне не нужно сначала записывать строку в файлы?
ИЗМЕНИТЬ 2:
Поэтому я решил не связывать свой динамический контент. По двум причинам:
- Это всего лишь 1 файл, поэтому я не нахожу преимуществ "связывания".
- Связывание предназначено для статического контента, это не
Итак, то, что я сделал, вручную минимизировал мой динамический css/js во время выполнения (один раз, затем кешировался). Таким образом, я могу легко обновить его, просто очистив кеш.
Это, как говорится, все еще актуальный вопрос (освежающие пучки), поэтому я оставлю его открытым.
Ответы
Ответ 1
То, что "magic guid/string" является хешем комбинированного содержимого файла.
Вы можете протестировать это со следующим рабочим процессом, который предполагает, что у вас есть mybundle.css
. Если вы используете Fiddler для просмотра трафика, вы увидите, что он запрашивает что-то с хешем, например
http://localhost:20206/mybundle.css?v=-6520265193368900210
Теперь "коснитесь" одного из файлов в комплекте столько, сколько хотите, без изменения содержимого. Файл более новый (LastModified/LastWrite более поздний), но хэш остается постоянным, поскольку он вычисляется из одного и того же комбинированного содержимого. Вы могли бы даже добавить пробелы в файл, так как они были бы уменьшены.
http://localhost:20206/mybundle.css?v=-6520265193368900210
Затем сделайте изменения. Возможно, установите границу 2px вместо 1px. Теперь хеш изменится, поскольку содержимое, подающее хэш, изменилось.
http://localhost:20206/mybundle.css?v=-4725541136976015445
Наконец, установите границу обратно в то, что было (в приведенном выше примере, назад к 1px). "Волшебная нить" на самом деле не случайна или магия вообще. Вместо этого он возвращается к соответствующему одностороннему хешу, вычисленному из содержимого.
http://localhost:20206/mybundle.css?v=-6520265193368900210
Теперь вы можете легко успокоиться, что хеш будет обновляться только тогда, когда это необходимо, без ручного вмешательства.
Что касается другой части вашего вопроса,
когда этот CSS/JS изменяется в базе данных, этот пакет должен быть "обновлено", чтобы содержимое этих файлов перечитывалось в расслоение.
Я думаю, мы просто отменим мышление. Вместо обновления пакета для запуска повторного чтения мы обновляем файлы для запуска обновления. Когда ASP.NET видит изменения файлов, он будет рекомбинировать содержимое и обновить хэш.
Ответ 2
У меня есть хорошие новости для вас. Многие люди просят поддержку виртуального пути для сценариев, похожих на ваши, где у них есть контент, который не обязательно с диска, поэтому мы в настоящее время планируем поддерживать VPP в следующей версии.
Чтобы воспользоваться этой поддержкой, вам нужно будет реализовать VPP для динамического js/css.
В VPP также встроены механизмы зависимостей кэша, поэтому мы должны иметь возможность использовать эти флажки для автоматического сброса нужной записи кэша пакетов.