Новые возможности пакетирования ASP.NET - Как программно обновить определенный пакет? - PullRequest
14 голосов
/ 29 марта 2012

Я слоняюсь с новыми функциями связывания ASP.NET (используя предварительную версию System.Web.Optmization 1.0.0-beta) в моем веб-приложении ASP.NET MVC 3.

Работаетотлично.

Однако у нас есть определенные динамические CSS / JS, которые хранятся в базе данных.

Я хочу добавить это в отдельный комплект для моего базового комплектаскажем "DynamicBundle".Я знаю, как это сделать, не проблема.

Теперь мой вопрос: когда этот CSS / JS изменяется в базе данных, этот пакет должен быть "обновлен", чтобы содержимое этих файлов повторно-читать в пакет.

По сути, мне нужно, чтобы ASP.NET заново сгенерировал этот магический указатель / строку, добавляемый к URL-адресу пакета.

В идеале мне бы хотелось толькообновить определенный пакет, а не всю таблицу пакетов.

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ:

Хорошо, вторая проблема, не могу понять, как добавить динамический CSS / JS в комплект.bundle.AddFile принимает виртуальный путь к файлу, но это не физический файл, это строка.Как я собираюсь это сделать?Конечно, мне не нужно сначала записывать строку в файлы?

РЕДАКТИРОВАТЬ 2: Так что я решил не связывать свой динамический контент.По 2 причинам:

  1. Это всего 1 файл, поэтому я не получаю никаких преимуществ "связывания"
  2. Связывание предназначено для статического содержимого, это не

Итак, что я сделал, так это вручную уменьшил динамические css / js во время выполнения (один раз, затем кэшировал).Таким образом, я могу легко обновить его, просто очистив кеш.

При этом, это все еще актуальный вопрос (обновление пакетов), поэтому я оставлю его открытым ..

Ответы [ 2 ]

5 голосов
/ 04 апреля 2012

То, что "этот волшебный 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 увидит изменение файла (ов), он рекомбинирует содержимое и обновит хеш.

3 голосов
/ 23 августа 2012

У меня для вас хорошие новости. Многие люди просят поддержки у провайдера виртуальных путей для сценариев, похожих на ваш, где у них есть контент, который не обязательно с диска, поэтому в настоящее время мы планируем поддерживать VPP в следующем выпуске.

Чтобы воспользоваться этой поддержкой, вам нужно реализовать VPP для вашей динамической js / css.

VPP также имеет встроенные механизмы зависимости кэша, поэтому мы должны иметь возможность использовать их для автоматической очистки правильной записи кэша пакета.

...