11

私はasp.netmvc4を持っています。IIS仮想ディレクトリを使用してこのアプリケーション内にサブディレクトリとして展開されるモジュールがあり、これらのモジュール内のファイルを参照する必要があります。これらのモジュールdllはバンドルを登録しています。しかし、バンドルはhtmlページに何も生成していません。

この投稿、is-it-possible-to-unit-test-bundleconfig-in-mvc4から、バンドルが内部的にServer.MapPathを使用していることがわかります。だから、うまくいくようです。

私はBundleTable.MapPathMethodをフックし、Server.MapPathを自分で呼び出しました。これは、正しい物理ディレクトリに正しく解決されます。ただし、それでもhtmlページには何もレンダリングされません。

次に、カスタムフォルダの「AddDirectory」関数について言及したこの投稿、why-does-resolvebundleurl-not-work-for-custom- foldersがありましたが、この関数は最新の最適化ライブラリでは使用できなくなりました。

新しい「IncludeDirectory」メソッドを使用してみましたが、それも機能しませんでした

ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);

この作品を作るために他に何かできることはありますか?


2012年8月27日

問題の解決:基本的に、System.Web.Optimizationは、サブIIS仮想ディレクトリであるWebURLでは機能しません。

問題は、BundleResolver.GetBundleContents内のこれらのコード行です。

string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))

これは基本的に、バンドルされるすべてのファイルがプライマリWebアプリケーションのPHYSICALフォルダーの下にあるPHYSICALフォルダーにあることを前提としています。

問題、IMOは、含めるファイルを検索するWeb相対URLパスが非常に早い段階で物理パスに変換され、それらの物理ファイルを取得するために使用された相対URLパスへのすべての参照が破棄されることです。

したがって、これを機能させることができるかどうかを確認するには、System.Web.Optimizationをベアコードに逆コンパイルしてから、再度コンパイルして「修正」する必要がありました。最初のステップは、BundleItemにRelativePathプロパティを追加することでした。これは、BundleItemに追加のコンストラクターを追加して、ソース相対URLパスを渡し、Web相対検索ディレクトリフォルダーが何であったかを保持します。次に、上記のコードをループに置き換えてから、基本的にBundleItemで見つかったファイルを再照合して、有効なWebURLに変換できるようにします。

foreach (BundleItem bundleItem in bundleFor.Items)
{
  if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
    string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
    str = str.Replace('\\', '/');
    strs.Add(str);
    break;
  }
}

これで、バンドルが適切にレンダリングされます。ただし、このハック修正のリリース、最適化、縮小化についてはまだテストしていないことに注意してください。

asp.netチームは、System.Web.OptimizationsがIIS仮想ディレクトリ内のファイルをサポートするようにする必要があると本当に思います。特に、VS2012がIIS Expressをサポートするようになったため、IIS仮想ディレクトリを介して参照されるファイルを使用してモジュラーWebアプリを簡単に構築できるようになります。

4

2 に答える 2

0

適切に構成すれば、virtualPathProvider を使用してこれを達成できるはずです。

登録方法については、こちらの回答を参照してください: BundleTable.Bundles.GetBundleFor() は返されますが、内部のアイテムは返されません

于 2015-02-17T19:51:28.867 に答える