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(...