... 또는 내가 어떻게 걱정을 멈추고 마이크로 소프트의 완전히 문서화되지 않은 API에 대해 코드를 작성하는 법을 배웠습니다 . 공식 System.Web.Optimization
릴리스에 대한 실제 문서가 있습니까? 'Cuz 나는 확실히 찾을 수없고, XML 문서도없고, 모든 블로그 게시물은 상당히 다른 RC API를 참조합니다. 아니 후 ..
자바 스크립트 종속성을 자동으로 해결하는 코드를 작성 중이며 해당 종속성에서 즉시 번들을 생성하고 있습니다. 스크립트를 편집하거나 응용 프로그램을 다시 시작하지 않고 번들에 영향을주는 변경 사항을 적용하는 경우를 제외하고 모든 것이 잘 작동합니다. 변경 사항이 반영되지 않습니다. 그래서 개발에 사용할 종속성 캐싱을 비활성화하는 옵션을 추가했습니다.
그러나 번들 컬렉션이 변경된 경우에도 분명히 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을 재사용하는 경우 재사용하기 전에 참조한 번들을 제거 했더라도 캐시에있는 모든 항목으로 응답하고 Bundles
객체를 변경해도 캐시가 플러시되지 않으므로 새 항목 만 (또는 오히려 다른 이름의 새 항목)이 사용됩니다.
동작이 이상해 보입니다. 컬렉션에서 무언가를 제거하면 캐시에서 제거해야합니다. 하지만 그렇지 않습니다. 이 캐시를 플러시하고 BundleCollection
해당 번들이 처음 액세스 될 때 캐시 된 내용 대신의 현재 내용을 사용하도록하는 방법이 있어야합니다 .
내가 어떻게 할 수 있을지 아십니까?
ResetAll
목적을 알 수없는 이 방법이 있지만 어차피 부수기 때문에 그렇지 않습니다.