Bundle Minification не работает при публикации приложения WebForms
Я пытаюсь использовать минимизацию пакетов для некоторых файлов .css и .js. Конфигурация моего пакета следующая:
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/Modernizr").Include(
"~/Scripts/modernizr.js"
));
bundles.Add(new StyleBundle("~/TemplateContent").Include(
"~/Content/bootstrap.css",
"~/Content/bootstrap-responsive.css",
"~/Content/prettyPhoto.css",
"~/Content/prettify.css",
"~/Content/flexslider.css",
"~/Content/iview.css",
"~/Content/style.css",
"~/Content/default.css"
));
bundles.Add(new StyleBundle("~/AppContent").Include(
"~/Content/bootstrap-tablesorter.css",
"~/Content/animate.css",
"~/Content/font-awesome.css",
"~/Content/jcarousel.css",
"~/Conten/overwrite.css",
"~/Content/sequence.css",
"~/Content/sequence.ie.css",
//more styles
));
bundles.Add(new ScriptBundle("~/TemplateScripts").Include(
"~/Scripts/modernizr-*",
"~/Scripts/jquery.js",
"~/Scripts/raphael.js",
"~/Scripts/jquery.easing.1.3.js",
"~/Scripts/bootstrap.js",
"~/Scripts/google-code-prettify/prettify.js",
"~/Scripts/jquery.elastislide.js",
"~/Scripts/jquery.tweet.js",
"~/Scripts/jquery.prettyPhoto.js",
"~/Scripts/jquery.flexslider.js",
"~/Scripts/iview.js",
"~/Scripts/jquery-hover-effect.js",
"~/Scripts/animate.js",
"~/Scripts/custom.js"
));
bundles.Add(new ScriptBundle("~/AppScripts").Include(
"~/Scripts/jquery.ticker.js",
"~/Scripts/jquery.contenthover.js",
"~/Scripts/jquery-ui-1.10.3.js",
"~/Scripts/datetimepicker.js",
"~/Scripts/jquery.metadata.js",
//more scripts
));
BundleTable.EnableOptimizations = true;
}
Проблема возникает, когда я публикую приложение на сервере (общий веб-хостинг godaddy), я получаю миниатюрный вывод, но я получаю 403 ошибки на этих выходах.
Если я установил
BundleTable.EnableOptimizations = false;
Файлы не будут уменьшены, но страница имеет правильное поведение.
Ответы
Ответ 1
Оказывается, это была аутентификация формы ASP.NET. Как указано в этом, имя пакета не должно быть существующим каталогом. И хорошо, аутентификация форм запрещает доступ к тем каталогам, которые не разрешены int web.config.
Я не знал, что пакеты создают свой собственный каталог, поэтому я в основном добавил тег местоположения для этих каталогов (хотя они физически не находятся в решении).
Итак, в основном...
Для всех предыдущих имен пакетов я добавил "~/bundles/", а затем создал следующий тег местоположения в файле web.config:
<location path="bundles">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Ответ 2
Пока вы не пытаетесь связать мини-скрипты, он должен работать. Иногда, если вы написали javascript, и вы пропустили точку с запятой, это может привести к сбою сценариев при их вызове, но не приведет к ошибке 403.
Так как вы получаете ошибку 403, я предполагаю, что это не связано с комплектом. Можете ли вы показать точную ошибку? Это 403.2: запрет чтения? Или это когда вы пытаетесь опубликовать на своем сайте (403.3: запрет на запись)? Лучшая настройка при разработке - правильно настроить локальную настройку IIS, чтобы вы могли связывать и публиковать выпуск на локальном компьютере. Если это работает, все, что вам нужно сделать, это скопировать файлы с локального компьютера на общедоступный сервер. Если на общедоступном сервере что-то не так, то вы знаете, что это ошибка конфигурации на этом компьютере, а не проблема с кодом.
Мое лучшее предположение заключается в том, что вы не можете публиковать свое приложение на своем сайте (вы получаете доступ к записи, запрещенный для некоторых папок), но без дополнительной информации это действительно сложно сказать.
РЕДАКТИРОВАТЬ: После прочтения немного больше о комплекте, я почти уверен, что вы связываете script с существующей папкой.
Каждый запрос в ASP.NET управляется через обработчики http (например, статический обработчик, обработчик страницы, обработчик ashx и т.д.). Существует специальный HTTP-модуль, называемый UrlRoutingModule, который соответствует маршрутам в global.asax. Если маршрут соответствует, то он будет обрабатывать текущий обработчик http, используя метод HttpContext.RemapHandler, иначе обычный поток ASP.NET будет продолжен. Аналогично System.Web.Optimization вставляет HTTP-модуль BundleModule, который пытается сопоставить привязку. Если найденное совпадение найдено, оно будет выбирать BundleHandler в качестве обработчика HTTP с использованием метода HttpContext.RemapHandler. Внутренне System.Web.Optimization оставит совпадение, если HostingEnvironment.VirtualPathProvider.FileExists(путь) истинно или HostingEnvironment.VirtualPathProvider.DirectoryExists(путь) истинно.
Прочитать весь поток
С учетом сказанного, все пучки начинаются с "~/bundles/" . Это гарантирует, что script не укажет на папку, которая существует или попадает в вашу программу маршрутизации.
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(...