... または、心配するのをやめて、Microsoft の完全に文書化されていない API に対してコードを書くことを学んだ方法. 公式System.Web.Optimization
リリースの実際のドキュメントはありますか? XMLドキュメントはなく、すべてのブログ投稿は実質的に異なるRC APIを参照しています。どーも..
JavaScript の依存関係を自動的に解決するコードを書いており、それらの依存関係からオンザフライでバンドルを作成しています。スクリプトを編集したり、アプリケーションを再起動せずにバンドルに影響を与えるような変更を加えたりした場合を除いて、すべてがうまく機能します。変更は反映されません。そこで、開発で使用する依存関係のキャッシュを無効にするオプションを追加しました。
ただし、バンドル コレクションが変更された場合でも、明らかBundleTables
に URL をキャッシュします。たとえば、自分のコードでバンドルを再作成する場合は、次のようにします。
// remove an existing bundle
BundleTable.Bundles.Remove(BundleTable.Bundles.GetBundleFor(bundleAlias));
// recreate it.
var bundle = new ScriptBundle(bundleAlias);
// dependencies is a collection of objects representing scripts,
// this creates a new bundle from that list.
foreach (var item in dependencies)
{
bundle.Include(item.Path);
}
// add the new bundle to the collection
BundleTable.Bundles.Add(bundle);
// bundleAlias is the same alias used previously to create the bundle,
// like "~/mybundle1"
var bundleUrl = BundleTable.Bundles.ResolveBundleUrl(bundleAlias);
// returns something like "/mybundle1?v=hzBkDmqVAC8R_Nme4OYZ5qoq5fLBIhAGguKa28lYLfQ1"
同じエイリアスを持つバンドルを削除して再作成するたびに、まったく何も起こりません。bundleUrl
返される fromResolveBundleUrl
は、バンドルを削除して再作成する前と同じです。「同じ」とは、バンドルの新しいコンテンツを反映するために、コンテンツ ハッシュが変更されていないことを意味します。
編集...実際には、それよりもはるかに悪いです。バンドル自体は、何らかの方法でBundles
コレクションの外にキャッシュされます。ブラウザがスクリプトをキャッシュしないように独自のランダム ハッシュを生成しただけでは、ASP.NET は古いスクリプトを返します。したがって、明らかに、からバンドルを削除しBundleTable.Bundles
ても実際には何も起こりません。
この問題を回避するためにエイリアスを変更するだけで済みます。これは開発には問題ありませんが、ページの読み込みごとにエイリアスを非推奨にするか、BundleCollection のサイズが大きくなる必要があるため、この考えは好きではありません。すべてのページの読み込み。これを本番環境でそのままにしておくと、大変なことになります。
BundleTables.Bundles
そのため、スクリプトが提供されると、実際のオブジェクトとは無関係にキャッシュされるようです。そのため、URL を再利用する場合、再利用する前にそれが参照していたバンドルを削除したとしても、キャッシュ内にあるもので応答し、Bundles
オブジェクトを変更してもキャッシュはフラッシュされません。つまり、新しいアイテム (またはむしろ、別の名前の新しいアイテム) が使用されることになります。
動作は奇妙に思えます...コレクションから何かを削除すると、キャッシュから削除されます。しかし、そうではありません。このキャッシュをフラッシュしてBundleCollection
、そのバンドルが最初にアクセスされたときにキャッシュされたものの代わりに現在のコンテンツを使用する方法が必要です。
どうすればこれを行うことができますか?
ResetAll
目的が不明なこのメソッドがありますが、とにかく物事を壊すだけなので、そうではありません。