web-dev-qa-db-ja.com

MVCバンドル-リソースの読み込みに失敗しました

何が原因でしょうか?ローカルで問題なくビルドして実行できるDurandalJSプロジェクトを使用しています。 Azure Webサイトにデプロイしようとすると、アプリが公開されますが、ブラウザーで次のエラーが発生します。

リソースの読み込みに失敗しました:サーバーは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"));
    }
}

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);
}
} 

私のhtmlページではこれを使用します:

@Scripts.Render("~/Scripts/vendor.js")

これにより、必要なライブラリ(ノックアウトなど)が読み込まれなくなります。それは私のweb.comfigに何かありますか?どんなヒントも素晴らしいでしょう。

UPDATE:

次のようにすると、正確な問題をローカルで再現できます。

new ScriptBundle("~/Scripts/vvendor.js")  // change the virtual output directory here

これは、何らかの理由で公開されたときにビューがディレクトリを見つけられないことを意味します...

13
RobVious

ScriptBundle名の「.js」部分を削除します。どういうわけかそれは問題の混乱を引き起こします。それはこれでなければなりません:

...
new ScriptBundle("~/Scripts/vendor")
...

次に、次のようにページに追加します。

@Scripts.Render("~/Scripts/vendor")
15
Brett

1.バンドル名にファイル拡張子を使用しないでください

Brett が言及しているように、バンドル名にファイル拡張子を含めることはできません。

これは、IISルーティングは、要求がファイルに対するものであると想定するためです拡張子が存在する場合

2.フォルダー名をバンドル名として使用しないでください

注:これは開発では発生しないので、本番環境にデプロイしたときにしか噛まない可能性があります

回避すべき2番目のことは、プロジェクト/ウェブサイトの実際のフォルダーの名前と一致するバンドル名を持つことです。 IISは物理フォルダーに一致しますバンドルルーティングに頼る前。

例えばログインページのスタイル用の/Content/Loginフォルダがある場合、~/Content/Loginというバンドルを使用できません。 IISは物理フォルダーを表示し、それがディレクトリブラウズリクエストであると想定します(Azureサーバーから403エラーが表示される可能性があります)。

推奨される命名:

すべてのバンドルでbundleという名前を使用して、ディレクトリの競合を回避し、cssも含めることをお勧めします。 プロジェクトにbundlesという名前のフォルダを含めないでください(上記の問題2のため)。

バンドル名の例:

  • 「〜/ bundles/jquery」
  • 「〜/バンドル/アドイン」
  • 「〜/ bundles/css」
  • 「〜/ bundles/css/login」
  • 「〜/ bundles/css/bootstrap」

23
Gone Coding

同様のエラーが発生しました。

私の場合、公開時にjavascriptバンドルを作成しないbundles.Add(new ScriptBundle("~/js")というバンドルがありました。

それから私はbundles.Add(new ScriptBundle("~/js/main")に変更し、うまくいきました!奇妙ですが、うまくいきました。しかし、正確な根本的な問題が何かはわかりません。

0
Dhanuka777