MVC捆绑 - 无法加载资源

Rob*_*ous 13 asp.net-mvc azure bundler azure-web-sites durandal

可能是什么导致了这个?我正在使用DurandalJS项目,该项目可以在本地构建和运行.当我尝试部署到Azure网站时,该应用程序发布但在浏览器中失败:

无法加载资源:服务器响应状态为404(未找到) http://appsite.azurewebsites.net/Scripts/vendor.js?v=KJCisWMhJYMzhLi_jWQXizLj9vHeNGfm_1c-uTOfBOM1

我没有定制任何捆绑.

我的捆绑配置:

public class BundleConfig
{
    // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                    "~/Scripts/jquery-ui-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.unobtrusive*",
                    "~/Scripts/jquery.validate*"));

        // Use the development version of Modernizr to develop with and learn from. Then, when you're
        // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-*"));

        bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

        bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                    "~/Content/themes/base/jquery.ui.core.css",
                    "~/Content/themes/base/jquery.ui.resizable.css",
                    "~/Content/themes/base/jquery.ui.selectable.css",
                    "~/Content/themes/base/jquery.ui.accordion.css",
                    "~/Content/themes/base/jquery.ui.autocomplete.css",
                    "~/Content/themes/base/jquery.ui.button.css",
                    "~/Content/themes/base/jquery.ui.dialog.css",
                    "~/Content/themes/base/jquery.ui.slider.css",
                    "~/Content/themes/base/jquery.ui.tabs.css",
                    "~/Content/themes/base/jquery.ui.datepicker.css",
                    "~/Content/themes/base/jquery.ui.progressbar.css",
                    "~/Content/themes/base/jquery.ui.theme.css"));
    }
}
Run Code Online (Sandbox Code Playgroud)

DurandalBundleConfig:

public class DurandalBundleConfig {
public static void RegisterBundles(BundleCollection bundles) {
  bundles.IgnoreList.Clear();
  AddDefaultIgnorePatterns(bundles.IgnoreList);

  bundles.Add(
    new ScriptBundle("~/Scripts/vendor.js")
        .Include("~/Scripts/jquery-{version}.js")
        .Include("~/Scripts/jquery-ui-{version}.js")
        .Include("~/Scripts/bootstrap.js")
        .Include("~/Scripts/knockout-{version}.js")
        .Include("~/Scripts/knockout.mapping-latest.js")
         .Include("~/Scripts/isotope.js")
          .Include("~/Scripts/toastr.js")
          .Include("~/Scripts/tag-it.js")
    );

  bundles.Add(
    new StyleBundle("~/Content/css")
      .Include("~/Content/ie10mobile.css")
      .Include("~/Content/app.css")
      .Include("~/Content/bootstrap.min.css")
      .Include("~/Content/bootstrap-responsive.min.css")
      .Include("~/Content/font-awesome.min.css")
      .Include("~/Content/durandal.css")
      .Include("~/Content/starterkit.css")
       .Include("~/Content/toastr.css")
       .Include("~/Content/tag-it.css")
       .Include("~/Content/zen-theme.css")
    );
}

public static void AddDefaultIgnorePatterns(IgnoreList ignoreList) {
  if(ignoreList == null) {
    throw new ArgumentNullException("ignoreList");
  }

  ignoreList.Ignore("*.intellisense.js");
  ignoreList.Ignore("*-vsdoc.js");
  ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
  //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
  //ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
}
} 
Run Code Online (Sandbox Code Playgroud)

在我的html页面中,我使用这个:

@Scripts.Render("~/Scripts/vendor.js")
Run Code Online (Sandbox Code Playgroud)

这样可以防止加载所需的库(如淘汰赛).它可能是我的web.comfig中的东西吗?任何提示都会很棒.

更新:

如果我执行以下操作,我可以在本地重现确切的问题:

new ScriptBundle("~/Scripts/vvendor.js")  // change the virtual output directory here
Run Code Online (Sandbox Code Playgroud)

我认为这意味着视图在出版时由于某种原因无法找到目录...

Gon*_*ing 23

1.不要在包名称中使用文件扩展名

正如Brett所提到的,您的捆绑名称中不应该有文件扩展名.

这样做的原因是,如果存在扩展,IIS路由将假定请求是针对文件.

2.不要将文件夹路径用作包名称

注意:这在开发中不会发生,因此在部署到生产时可能只会咬你

要避免的第二件事是拥有与项目/网站中真实文件夹名称相匹配的包名称.IIS将在物理文件夹转换为捆绑路由之前匹配.

例如,如果您有/Content/Login登录页面样式的文件夹,则不能使用名为的包~/Content/Login.IIS将看到物理文件夹并假设它是目录浏览请求(您可能会从Azure服务器收到403错误).

建议命名:

建议您bundle在所有捆绑包中使用该名称,以避免目录冲突,并包括css.在项目中不要有一个名为bundles的文件夹(因为上面的问题2).

示例包名称:

  • "〜/捆绑/ jquery的"
  • "〜/捆绑/加载项"
  • "〜/束/的CSS"
  • "〜/捆绑/ CSS /登录"
  • "〜/捆绑/ CSS /自举"

等等


Bre*_*ett 15

摆脱ScriptBundle名称中的".js"部分.由于某种原因导致一堆问题.它应该是这样的:

...
new ScriptBundle("~/Scripts/vendor")
...
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的页面,如下所示:

@Scripts.Render("~/Scripts/vendor")
Run Code Online (Sandbox Code Playgroud)