背景: HTML 5 Offline App Cache を使用して、マニフェスト ファイルを動的に構築しています。基本的に、マニフェスト ファイルには、ページが要求する各静的ファイルをリストする必要があります。ファイルが実際に静的な場合はうまく機能しますが、私は でバンドルと縮小を使用してSystem.Web.Optimizationいるため、ファイルは静的ではありません。
DEBUG シンボルが読み込まれると (つまり、VS でのデバッグ)、実際の物理ファイルが MVC ビューから呼び出されます。ただし、リリース モードでは、次のような仮想ファイルを呼び出します。/bundles/scripts/jquery?v=FVs3ACwOLIVInrAl5sdzR2jrCDmVOWFbZMY6g6Q0ulE1
だから私の質問: コードでその URL を取得してオフライン アプリ マニフェストに追加するにはどうすればよいですか?
私はもう試した:
var paths = new List<string>()
{
"~/bundles/styles/common",
"~/bundles/styles/common1024",
"~/bundles/styles/common768",
"~/bundles/styles/common480",
"~/bundles/styles/frontend",
"~/bundles/scripts/jquery",
"~/bundles/scripts/common",
"~/bundles/scripts/frontend"
};
var bundleTable = BundleTable.Bundles;
foreach (var bundle in bundleTable.Where(b => paths.Contains(b.Path)))
{
var bundleContext = new BundleContext(this.HttpContext, bundleTable, bundle.Path);
IEnumerable<BundleFile> files = bundle.GenerateBundleResponse(bundleContext).Files;
foreach (var file in files)
{
var filePath = file.IncludedVirtualPath.TrimStart(new[] { '~' });
sb.AppendFormat(formatFullDomain, filePath);
}
}
に置き換えるだけGenerateBundleResponse()でEnumerateFiles()なく、常に元のファイル パスを返すだけです。
代替の実装の提案も受け付けています。ありがとう。
更新: (7/7/14 13:45)
以下の回答と同様に、この Bundles Registry クラスを追加して、必要な静的ファイルのリストを保持し、すべてのブラウザーでデバッグ モードで動作するようにしました。(以下のコメントを参照)
public class Registry
{
public bool Debug = false;
public Registry()
{
SetDebug();
}
[Conditional("DEBUG")]
private void SetDebug()
{
Debug = true;
}
public IEnumerable<string> CommonScripts
{
get
{
if (Debug)
{
return new string[]{
"/scripts/common/jquery.validate.js",
"/scripts/common/jquery.validate.unobtrusive.js",
"/scripts/common/knockout-3.1.0.debug.js",
"/scripts/common/jquery.timepicker.js",
"/scripts/common/datepicker.js",
"/scripts/common/utils.js",
"/scripts/common/jquery.minicolors.js",
"/scripts/common/chosen.jquery.custom.js"
};
}
else
{
return new string[]{
"/scripts/common/commonbundle.js"
};
}
}
}
}
私はこの解決策に決して満足していません。これを改善できる場合は、提案をしてください。