发布 WebForms 应用程序时bundle缩小不起作用



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

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

原来是 ASP.NET 表单身份验证。因此,捆绑包的名称不应是现有目录。好吧,表单身份验证拒绝访问那些不允许在 web.config 中的目录。

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

所以基本上...

对于之前的所有捆绑包名称,我添加了"~/bundles/",然后在 web.config 中创建了以下位置标记:

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

只要你不尝试捆绑缩小的脚本,它应该可以工作。有时,如果您编写了 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.Add(new ScriptBundle("~/bundles/jquery").Include(...

我的脚本包由于捆绑包名称中的点而失败,这解释了为什么它在调试中工作(因为那里没有真正的捆绑)并且在发布时失败。

之前(失败)

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

之后(固定)

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

不要忘记更新您的 razor 引用以使用固定的捆绑包名称

最新更新