2013-11-11 1 views
14

Я пытаюсь использовать минимизацию пакетов для некоторых файлов .css и .js. Мой пакет конфигурации заключается в следующем:Bundle Minification не работает при публикации приложения WebForms

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; 

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

ответ

16

Оказалось, что это была аутентификация формы ASP.NET. Поскольку согласно this, имя пакета не должно быть существующим каталогом. И хорошо, аутентификация форм запрещает доступ к тем каталогам, которые не разрешены int web.config.

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

Поэтому в основном ...

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

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

Спасибо! То, что я сделал, изменило путь в моей конфигурации пакета. Я соответствующим образом обновил свой макет представления, а затем почесал голову кучей, пытаясь понять, почему это все равно не сработает. Я, наконец, понял, что обновил файлы bin на своем сайте, но не макет, который вызывал старый путь пакета. –

+0

Исправлена ​​проблема для проекта asp.net mvc, над которым я работаю. Спасибо! – mike123

1

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

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

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

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

Каждый запрос в 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 (путь) является истинным.

Read the whole thread

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

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(... 
+0

Привет, Я подумал именно об этом и дал права на чтение и запись в каталог в IIS, но проблема осталась. Затем я отключил оптимизацию, и приложение работало, поэтому я отбросил проблему на сервере. Самое странное, что я опубликовал приложение MVC с точной конфигурацией, и он отлично работал, даже не требовал дополнительных разрешений в IIS. Кроме того, я использую проверку подлинности с помощью форм, и я предоставляю доступ к каталогам в тегах местоположения веб-конфигурации, так что это тоже не так. – RainierMallol

+0

ПОСЛЕ ИЗМЕНЕНИЯ: Я читал о проблеме здесь: stackoverflow.com/questions/13673759/... Но это было не так. Я понял это, оказывается, это аутентификация формы ASP.NET, проверьте мой ответ для более подробной информации. Большое спасибо. – RainierMallol