... hoặc cách tôi học cách ngừng lo lắng và chỉ viết mã chống lại các API hoàn toàn không có tài liệu từ Microsoft . Có tài liệu thực tế nào về System.Web.Optimization
bản phát hành chính thức không? 'Vì tôi chắc chắn không thể tìm thấy bất kỳ tài liệu nào, không có tài liệu XML và tất cả các bài đăng trên blog đều đề cập đến API RC, về cơ bản là khác nhau. Anyhoo ..
Tôi đang viết một số mã để tự động giải quyết các phụ thuộc javascript và đang tạo các gói ngay lập tức từ các phụ thuộc đó. Mọi thứ đều hoạt động tốt, ngoại trừ trường hợp bạn chỉnh sửa tập lệnh hoặc thực hiện các thay đổi có thể ảnh hưởng đến một gói mà không khởi động lại ứng dụng, các thay đổi sẽ không được phản ánh. Vì vậy, tôi đã thêm một tùy chọn để tắt bộ nhớ đệm của các phụ thuộc để sử dụng trong phát triển.
Tuy nhiên, dường như BundleTables
URL lưu vào bộ nhớ cache ngay cả khi bộ sưu tập gói đã thay đổi . Ví dụ: trong mã của riêng tôi khi tôi muốn tạo lại một nhóm, tôi làm như sau:
// 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"
Bất cứ khi nào tôi xóa và tạo lại một gói có cùng bí danh , hoàn toàn không có gì xảy ra: kết quả bundleUrl
trả về ResolveBundleUrl
giống như trước khi tôi xóa và tạo lại gói. "Giống nhau", ý tôi là hàm băm nội dung không thay đổi để phản ánh nội dung mới của gói.
chỉnh sửa ... thực ra, nó còn tệ hơn thế nhiều. Bản thân gói được lưu trong bộ nhớ cache bằng cách nào đó bên ngoài Bundles
bộ sưu tập. Nếu tôi chỉ tạo mã băm ngẫu nhiên của riêng mình để ngăn trình duyệt lưu tập lệnh vào bộ nhớ đệm, ASP.NET sẽ trả về tập lệnh cũ . Vì vậy, rõ ràng, việc xóa một gói khỏi BundleTable.Bundles
thực sự không làm được gì cả.
Tôi chỉ có thể thay đổi bí danh để giải quyết vấn đề này và điều đó được chấp nhận để phát triển, nhưng tôi không thích ý tưởng đó vì nó có nghĩa là tôi phải ngừng sử dụng bí danh sau mỗi lần tải trang hoặc có BundleCollection tăng kích thước trên mỗi lần tải trang. Nếu bạn để điều này trong môi trường sản xuất, đó sẽ là một thảm họa.
Vì vậy, có vẻ như khi một tập lệnh được phân phát, nó sẽ được lưu vào bộ nhớ đệm độc lập với BundleTables.Bundles
đối tượng thực tế . Vì vậy, nếu bạn sử dụng lại một URL, ngay cả khi bạn đã xóa gói mà nó tham chiếu trước khi sử dụng lại, nó sẽ phản hồi với bất kỳ thứ gì trong bộ nhớ cache của nó và việc thay đổi Bundles
đối tượng không xóa bộ nhớ cache - vì vậy chỉ các mục mới (hoặc thay vào đó, các mục mới với một tên khác) sẽ được sử dụng.
Hành vi có vẻ kỳ quặc ... việc xóa nội dung nào đó khỏi bộ sưu tập sẽ xóa nó khỏi bộ nhớ cache. Nhưng nó không. Phải có một cách để xóa bộ nhớ cache này và để nó sử dụng nội dung hiện tại của nội dung BundleCollection
thay vì những gì nó đã lưu trong bộ nhớ cache khi gói đó được truy cập lần đầu.
Bất kỳ ý tưởng làm thế nào tôi sẽ làm điều này?
Có một ResetAll
phương pháp này có mục đích không xác định nhưng dù sao nó cũng phá vỡ mọi thứ nên không phải vậy.