我正在尝试对一些.css和.js文件使用bundle minification。我的捆绑包配置如下:
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;
文件没有缩小,但页面的行为正确。
答案 0 :(得分:16)
原来是ASP.NET表单身份验证。根据{{3}},bundle的名称不应该是现有目录。好吧,表单身份验证拒绝访问web.config中不允许的那些目录。
我不知道bundle会创建自己的目录,所以我基本上为这些目录添加了位置标记(即使它们不在解决方案中)。
所以基本上......
对于所有以前的包名称,我添加了“〜/ bundles /”,然后在web.config中创建了以下位置标记:
<location path="bundles">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
答案 1 :(得分:1)
只要您不尝试捆绑缩小的脚本,它就应该有效。有时候如果你写了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内部将保持匹配。
有了这个说法,所有捆绑包都以“〜/ bundles /”开头。这将确保脚本不会指向存在或被路由配置捕获的文件夹。
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(...
答案 2 :(得分:0)
我的脚本捆绑软件由于捆绑软件名称中的点而失败,这说明了为什么它可以在调试中工作(因为那里没有真正的捆绑软件),并且在发布时也失败了。
(失败之前)
bundles.Add(new ScriptBundle("~/bundles/My.Corp.Scripts").Include(...
之后(固定)
bundles.Add(new ScriptBundle("~/bundles/MyCorpScripts").Include(...
别忘了更新剃刀引用以使用固定的捆绑包名称