7

Tôi là ASP.NET MVC v4 cho ứng dụng của mình và tôi đang sử dụng các tính năng tối ưu hóa web (gói và rút gọn các tập lệnh và kiểu).Có cách nào để cập nhật nội dung gói asp.net mvc tự động vào thời gian chạy không?

Bây giờ, những gì tôi hiểu là (hãy sửa tôi nếu sai), khung tối ưu hóa sẽ xem xét các tệp được bao gồm tại thời điểm biên dịch và định cấu hình chúng. Nó sẽ tạo một số phiên bản (v = cái gì đó) dựa trên nội dung. Mỗi khi nội dung thay đổi, nó sẽ tạo lại băm phiên bản và ứng dụng khách sẽ nhận được các tệp cập nhật.

Bây giờ, là có một cách để có được thực hiện sau đây

[1] Cập nhật một cái gì đó bên trong một file js trong máy chủ của tôi, và phục vụ công tác cập nhật một cho khách hàng mà không cần xây dựng & tái khởi động ứng dụng (Tôi không thay đổi cấu hình gói ở đây, chỉ cập nhật nội dung tệp bên trong tập lệnh)?

[2] Cập nhật chính cấu hình tập lệnh (ví dụ: thêm tập lệnh mới vào gói) và nhận được tập lệnh đó cho khách hàng mà không cần biên dịch lại & Xem lại ứng dụng? Hoặc, ít nhất là không biên dịch lại? (Tôi biết, thông thường chúng tôi xác định các gói bên trong các tệp cs, nhưng tự hỏi nếu có cách nào thoát ra!)

[3] Có cách nào để sử dụng số phiên bản của riêng tôi (nói từ tệp cấu hình, v = myCustomScriptVersion)) thay vì băm phiên bản được tạo tự động?

+0

Các gói không được định cấu hình trong quá trình biên dịch, chúng được định cấu hình trong thời gian chạy trong suốt quá trình Application_Start. – danludwig

+0

@danludwig, nội dung đóng gói thực sự được xác định trong thời gian biên dịch. – haim770

+1

@ haim770 chúng được định nghĩa tại thời gian biên dịch, nhưng chúng được cấu hình trong thời gian chạy. Appplication_Start sẽ gọi BundleConfig.RegisterBundles, thêm các gói vào bộ sưu tập. Mã này chạy ... khi chạy. – danludwig

Trả lời

7

Hơi muộn, nhưng tôi chỉ chia sẻ kinh nghiệm của mình về các câu hỏi của riêng mình tại đây.

Như được thảo luận trong các nhận xét của câu hỏi, các gói được định nghĩa là một phần của tệp cs (thường là BundleConfig.cs bên trong App_Start). Vì vậy, các bó được định nghĩa tại thời gian biên dịch và khi bắt đầu ứng dụng, chúng sẽ được thêm vào bộ sưu tập và có thể sử dụng được.

Bây giờ, một chút thú vị. Tại thời gian chạy, khung tối ưu hóa xem xét các tệp được bao gồm và tạo ra một hàm băm của nội dung và nối nó dưới dạng chuỗi truy vấn phiên bản vào yêu cầu nhóm. Vì vậy, khi gói được gọi là uri được tạo ra giống như dưới đây.

http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81

Số phiên bản này v = ... hoàn toàn động. Nếu bất kỳ nội dung tệp nào trong gói được thay đổi, phiên bản này sẽ được tạo lại và sẽ vẫn giữ nguyên.

Bây giờ để trả lời các câu hỏi,

[1] Điều này được thực hiện tự động theo khuôn khổ, không cần phải làm gì thêm cho việc này. Mỗi khi nội dung tập tin được thay đổi, số phiên bản mới sẽ được tạo và khách hàng sẽ nhận được các tập lệnh cập nhật.

[2] Không thể. Nếu các tệp được bao gồm trong một gói được thay đổi, thì phải được biên dịch lại.

[3] Có, nó có thể được sử dụng. Số phiên bản tùy chỉnh có thể được thêm như sau.

@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"]) 

Nhưng thận trọng! Thao tác này sẽ xóa phiên bản tự động dựa trên nội dung tệp.

Và ngoài ra, nếu có nhiều phiên bản của cùng một tệp và chúng tôi luôn muốn bao gồm phiên bản mới nhất có thể dễ dàng đạt được bằng cách bao gồm ký tự đại diện {phiên bản} trong cấu hình nhóm như dưới đây.

bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts") 
      .Include(
       "~/Scripts/Vendor/someScript-{version}.js" 
      )); 

Vì vậy, nếu có 2 kịch bản trong thư mục /Scripts/Vendor someScript-2.3.js someScript-3.4.js

Sau đó, các tập tin someScript-3.4.js (phiên bản cao hơn) sẽ được bao gồm tự động. Và khi một tệp mới someScript-4.0.js được thêm vào thư mục, thư mục này sẽ được phân phát cho khách hàng mà không cần phải biên dịch lại/khởi động lại.

Các vấn đề liên quan