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;

Файлы не минимизированы, но страница имеет правильное поведение.

2 ответа

Решение

Оказывается, это была аутентификация ASP.NET формы. В соответствии с этим, имя пакета не должно быть существующим каталогом. Кроме того, проверка подлинности с помощью форм запрещает доступ к тем каталогам, которые не разрешены в файле web.config.

Я не знал, что пакеты создают свои собственные каталоги, поэтому я в основном добавил тег местоположения для этих каталогов (хотя они физически не находятся в решении).

Так что в основном...

Для всех предыдущих имен пакетов я добавил "~/bundles/", а затем создал следующий тег местоположения в файле web.config:

<location path="bundles">
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</location>

Мой пакет скриптов не работал из-за точек в названии пакета, что объясняет, почему он работал при отладке (поскольку там нет реального связывания) и не сработал при выпуске..

ДО (неудача)

bundles.Add(new ScriptBundle("~/bundles/My.Corp.Scripts").Include(...

ПОСЛЕ (исправлено)

bundles.Add(new ScriptBundle("~/bundles/MyCorpScripts").Include(...

Не забудьте обновить ссылки на бритву, чтобы использовать фиксированное имя пакета

Пока вы не пытаетесь связать минимизированные сценарии, это должно работать. Иногда, если вы написали javascript и пропустили точку с запятой, это может привести к сбою сценариев при их вызове, но не к ошибке 403.

Так как вы получаете ошибку 403, я предполагаю, что это не связано с комплектацией. Можете ли вы показать точную ошибку? Это 403.2: доступ для чтения запрещен? Или когда вы пытаетесь опубликовать на своем сайте (403.3: доступ для записи запрещен)? Наилучшая настройка при разработке - правильно настроить локальный IIS, чтобы вы могли связывать и публиковать выпуск на локальном компьютере. Если это работает, все, что вам нужно сделать, это скопировать файлы с локального компьютера на общедоступный сервер. Если что-то не так на общедоступном сервере, то вы знаете, что это ошибка конфигурации на этом компьютере, а не проблема кода.

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

РЕДАКТИРОВАТЬ: После прочтения немного больше о комплектации я почти уверен, что вы связываете скрипт в существующую папку.

Каждый запрос в 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(path) имеет значение true или HostingEnvironment.VirtualPathProvider.DirectoryExists(path) имеет значение true.

Читать всю ветку

С учетом сказанного, начните все пакеты с "~ / bundles /". Это гарантирует, что сценарий не будет указывать на папку, которая существует или будет захвачена вашей конфигурацией маршрута.

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(...
Другие вопросы по тегам