Подтвердить что ты не робот

Связывание ASP.NET - пакет, не обновляющийся после того, как включен файл с добавлением (возвращается 304 не изменен)

Я пытаюсь связать ASP.NET с приложением ASP.NET MVC 4. Ситуация заключается в том, что я хочу создать службу стиля CDN, в которой есть файлы JS и CSS, с которыми вы можете обращаться с других сайтов с таким адресом: http://www.mycdn.com/scripts/plugin/js, который связывает и минимизирует все включенные .js файлы.

Конфигурация моего пакета для одного файла выглядит следующим образом:

bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));

Однако, когда я это делаю, пакеты не обновляются, даже после того, как я меняю исходные js файлы. Я продолжаю получать 304 Not Modified, когда обновляю свой браузер, а содержимое мини файла не обновляется. Как я могу сделать обновление пакетов, потому что бесполезно иметь пакеты со старым контентом? Я старался изо всех сил, но не мог найти решение.

Спасибо заранее!

4b9b3361

Ответ 1

У меня была точно такая же проблема. У меня есть папка с двумя файлами CSS:

  • ~/Content/main.css
  • ~/Content/main.min.css(ранее существовавший из моего предыдущего процесса ручного минимизации)

Мой код связывания:

bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));

Независимо от того, насколько я изменил свой main.css, вывод был тем же url с тем же содержимым:

<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>

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

Однако , как только я удалил main.min.css, все стало нормально работать. Играя немного больше, я обнаружил, что если есть как main.css, так и main.min.css, то обновление main.min.css на самом деле обновит пакет... Странность, но, по крайней мере, предсказуемая.

Ответ 2

После боя, чтобы выяснить, что делает обновление кеша пакетов, я пришел к нескольким выводам, которые, надеюсь, помогут другим:

Если .min файлы включены в состав пакета:

  • режим выпуска + изменение min js code = обновление кеша
  • режим выпуска + изменение не min js code = обновление кэша
  • режим отладки + изменение min js code = обновление кэша
  • режим отладки + изменение не min js code = обновление кэша

Если .min файлы НЕ включены как часть пакета:

  • режим отладки + изменение js code = обновление кэша
  • режим выпуска + изменение js code = обновление кеша

Примечания

  • В режиме отладки я подразумеваю компиляцию web.config debug = true (и BundleTable.EnableOptimizations = false или опущен)
  • В режиме деблокирования я подразумеваю компиляцию web.config debug = false (и BundleTable.EnableOptimizations = true или опущен
  • Убедитесь, что вы действительно вносите изменения в код. Такие изменения, как пробелы и комментарии не влияют на итоговые мини-js, поэтому сервер правильно, что изменений нет (так что кеш пучка не обновилась).

Ответ 3

Хорошо, вот моя история. Я отключил генерацию файлов min для меньшего количества файлов в Web Essentials. Старые файлы мин не удалялись, и в комплекте они видели вместо обновленного CSS. Удачи!

EDIT

Спустя некоторое время я провел еще два хороших 2 часа по одной и той же проблеме. На этот раз это была моя ошибка, я думаю, я забыл ведущую тильду, то есть написал

Scripts.Render("/js/script")

вместо

Scripts.Render("~/js/script")

По какой-то причине он иногда работал, а иногда и не делал этого.

Ответ 4

Я решил не использовать System.Web.Optimization для этой задачи, но нашел Microsoft Ajax Minifier, который также включен в файл WebGrease.dll, который поставляется с библиотекой MVC4 System.Web.Optimization. Я написал следующую функцию, которую я затем вызывал в Application_Start для каждого миниатюрного файла:

    public static void MinifyFile(string virtualPath)
    {
        string fullPath = HttpContext.Current.Server.MapPath(virtualPath);
        string extension = Path.GetExtension(fullPath).ToLower();
        string targetPath = fullPath.Substring(0, fullPath.Length - extension.Length) + ".min" + extension;
        if(File.Exists(fullPath) == false) 
        {
            throw new FileNotFoundException("File not found: " + fullPath);
        }
        string input = File.ReadAllText(fullPath);
        string output;
        if (extension == ".js")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyJavaScript(input);
        }
        else if (extension == ".css")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyStyleSheet(input);                
        }
        else
        {
            throw new NotSupportedException(extension + " is not supported for minification.");
        }
        File.WriteAllText(targetPath, output);
    }

Теперь мое приложение минимизирует все файлы на Application_Start.

Ответ 5

Обратите внимание: если вы используете Google Chrome, кеширование довольно агрессивное. Чтобы обеспечить отсутствие кеширования, вы можете сделать Ctrl-Shift-I, чтобы открыть панель разработчика. Перейдите к Network и нажмите Disable Cache. Убедитесь, что вы держите его открытым. Обновите страницу. Ваш кеш должен быть очищен, и изменения файла должны быть отображены.

Отключить кеш в Google Chrome

Ответ 6

Я не уверен, что функция, которая сейчас стоит, действительно будет поддерживать CDN, поскольку она неявно полагается на url, чтобы содержать хэш-код, чтобы предотвратить кеширование браузера.

Но я могу попытаться помочь вам попытаться добраться туда, и, возможно, это возможно сегодня... Одной из проблем, которые потенциально могут быть препятствием, является то, что BundleHandler вернет 304 на любые запросы пакетов, содержащие заголовок IfLastModified, поскольку предполагается, что кеш браузера всегда действителен из-за отпечатка пальца в URL-адресе.

Можете ли вы добавить некоторые подробности о том, как вы показываете ссылки на пакеты? Вы используете что-то вроде Scripts.Render( "~/Scripts/plugin/pluginjs" )?

Тег вашего пакета script должен выглядеть примерно так:

Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>

Если тэги script ссылаются на необработанный пакет без строки версии, это, вероятно, объяснит проблемы кэширования, которые вы видите:

Not good: <script src="/fbt/bundles/js></script>

Ответ 7

Операция связывания чувствительна к регистру. Убедитесь, что имя файла имеет правильный случай.

Мне пришлось изменить строку в моей BundleConfig.cs:

bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/bootstrap.css",
    "~/Content/Site.css"));  <-- Uppercased.

Ответ 8

Я знаю, что это было некоторое время, так как это было обновлено, но я обнаружил, что мне просто нужно подождать пару секунд, чтобы пучок догнал мои изменения css. У меня меньше загрузочных файлов bootstrap в css и min.css, и это определенно не мгновенно, чтобы увидеть мои изменения. Для меня это было около 10 секунд на быстром ПК с ssd. Ваши мили могут отличаться в зависимости от ваших системных спецификаций.

Ответ 9

Я видел этот ответ, но ничто из этого не было для меня. Были определенные правила CSS, которые делали сброс связки стилей, и я получал один и тот же хеш, даже если я внес изменения в файл CSS. Все это работало правильно для меня.

В моем случае нарушение правила CSS-селектора было -

#globalSearch.searching { ... }

Если я сделал это просто

.searching { ... }

Все снова начинает работать, и любые изменения, которые я делаю в моем файле css, корректно изменяет хэш-узел. Просто добавьте этот ответ, поскольку он может помочь кому-то.

Ответ 10

Просто обновите System.Web.Optimization от NuGet enter image description here

enter image description here

Ответ 11

Для чего это стоит, у меня была такая же проблема только сейчас, когда один js файл необъяснимо отказывался обновлять независимо от того, что (перестроить, принудительно очистить кеш и т.д.). Через некоторое время я включил средства отладки клиента в IE (F12), чтобы начать просмотр сетевого трафика, и этот акт сам заставлял JS файл обновляться. Пойдите фигурой, но она сработала.

Ответ 12

Проблема для меня была у Fiddler. После того, как я закрыл dit и перестроил свое решение, я загрузил изменения в файл js для меня.

Ответ 13

У меня была аналогичная проблема. В моей ситуации у меня был файл CSS, на который ссылался в наборе стилей, и имел этот пакет, упомянутый в моем представлении MVC. У меня также был флаг "EnableOptimizations", установленный на false в коде пакета.

Несмотря на все это, представление отказалось обновить, чтобы включить новый файл CSS.

Моим решением было создать мини-версию файла CSS и включить его в проект, и он начал работать. Я понятия не имею, почему это было бы так, потому что этот миниатюрный файл нигде не упоминается (даже после того, как обновлено представление), и его даже не следует рассматривать, поскольку код не настроен на оптимизацию. Это, скорее всего, ошибка (или функция) функциональности связывания. Я надеюсь, что это поможет кому-то еще столкнуться с этой проблемой.