Bundle Minification在发布WebForms App时不起作用

我正在尝试对一些.css和.js文件使用bundle minification。 我的bundle配置如下:

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; 

文件不会缩小,但页面具有正确的行为。

原来它是ASP.NET表单身份validation。 根据这一点 ,bundle的名称不应该是现有目录。 好吧,表单身份validation拒绝访问web.config中不允许的那些目录。

我不知道bundle会创建自己的目录,所以我基本上为这些目录添加了位置标记(即使它们实际上不在解决方案中)。

基本上……

对于所有以前的bundle名称,我添加了“〜/ bundles /”,然后在web.config中创建了以下位置标记:

        

只要你不尝试捆绑缩小的脚本,它应该工作。 有时如果您编写了javascript并且错过了分号,这可能会导致脚本在调用时失败,但不会抛出403错误。

由于您收到403错误,我猜这与捆绑无关。 你能表明确切的错误吗? 它是403.2:禁止读取访问权限吗? 或者是当您尝试发布到您的站点时(403.3:禁止写入访问)? 开发时的最佳设置是正确设置本地IIS,以便可以将发布捆绑并发布到本地计算机。 如果这样可行,那么您需要做的就是将文件从本地计算机复制到公共服务器。 如果公共服务器上出现问题,那么您知道该计算机上存在配置错误,而不是代码问题。

我最好的猜测是,您不允许将您的应用程序发布到您的站点(您的某些文件夹会被拒绝写入访问权限),但如果没有进一步的信息,则很难说。

编辑:在阅读了更多关于捆绑的内容后,我几乎可以肯定您正在将脚本捆绑到现有文件夹中。

ASP.NET中的每个请求都通过http处理程序管理(例如,静态处理程序,页面处理程序,ashx处理程序等)。 有一个名为UrlRoutingModule的特殊HTTP模块,它匹配global.asax中的路由。 如果一个路由匹配,那么它将使用HttpContext.RemapHandler方法来修改当前的http处理程序,否则正常的ASP.NET流程将继续。 类似地,System.Web.Optimization插入一个试图匹配绑定的BundleModule http模块。 如果找到匹配项,则它将使用HttpContext.RemapHandler方法将BundleHandler选择为http处理程序。 如果HostingEnvironment.VirtualPathProvider.FileExists(path)为true或HostingEnvironment.VirtualPathProvider.DirectoryExists(path)为true,则System.Web.Optimization内部将保持匹配。

阅读整个post

有了这个说法,所有捆绑包都以“〜/ bundles /”开头。 这将确保脚本不会指向存在或被路由配置捕获的文件夹。

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