...または、心配するのをやめて、Microsoftの完全に文書化されていないAPIに対してコードを書くことをどのように学んだか。公式System.Web.Optimization
リリースの実際のドキュメントはありますか?'cuz確かに何も見つかりません、XMLドキュメントはありません、そしてすべてのブログ投稿は実質的に異なるRCAPIを参照しています。Anyhoo ..
私は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
返されるのResolveBundleUrl
は、バンドルを削除して再作成する前と同じです。「同じ」とは、バンドルの新しいコンテンツを反映するためにコンテンツハッシュが変更されていないことを意味します。
編集...実際には、それよりもはるかに悪いです。バンドル自体は何とか外のキャッシュされるBundles
コレクション。ブラウザがスクリプトをキャッシュしないように独自のランダムハッシュを生成するだけの場合、ASP.NETは古いスクリプトを返します。したがって、どうやら、からバンドルを削除BundleTable.Bundles
しても実際には何も起こりません。
この問題を回避するためにエイリアスを変更するだけで済みます。これは開発には問題ありませんが、ページの読み込みごとにエイリアスを非推奨にするか、BundleCollectionのサイズが大きくなるため、このアイデアは好きではありません。すべてのページが読み込まれます。これを実稼働環境でオンのままにすると、災害になります。
したがって、スクリプトが提供されると、実際のBundleTables.Bundles
オブジェクトとは関係なくキャッシュされるようです。したがって、URLを再利用する場合、参照するバンドルを削除してから再利用しても、そのURLはキャッシュ内にあるもので応答し、Bundles
オブジェクトを変更してもキャッシュはフラッシュされません。つまり、新しいアイテム(またはむしろ、別の名前の新しいアイテムが使用されることはありません。
動作は奇妙に思えます...コレクションから何かを削除すると、キャッシュから削除されるはずです。しかし、そうではありません。このキャッシュをフラッシュしBundleCollection
、そのバンドルが最初にアクセスされたときにキャッシュされたものではなく、現在のコンテンツを使用する方法が必要です。
私がこれをどのように行うかについて何か考えはありますか?
ResetAll
目的がわからないこの方法がありますが、とにかく物事を壊すだけなので、そうではありません。