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

时间:2013-11-11 14:29:57

标签: c# webforms bundling-and-minification

我正在尝试对一些.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;

文件没有缩小,但页面的行为正确。

3 个答案:

答案 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内部将保持匹配。

Read the whole thread

有了这个说法,所有捆绑包都以“〜/ 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(...

别忘了更新剃刀引用以使用固定的捆绑包名称