14

Tôi đang mút xung quanh với các tính năng mới của ASP.NET (sử dụng System.Web.Optmization 1.0.0 beta trước khi phát hành) trong ứng dụng web ASP.NET MVC 3 của tôi.Tính năng mới của ASP.NET Bundling - Làm cách nào để tôi có thể làm mới một gói nhất định theo lập trình?

Hoạt động tuyệt vời.

Tuy nhiên, chúng tôi có động nhất định CSS/JS được lưu trữ trong cơ sở dữ liệu.

Tôi muốn làm điều này được thêm vào một gói riêng biệt cho gói cốt lõi của tôi, nói "DynamicBundle". Tôi biết làm thế nào để làm điều đó, không phải là một vấn đề.

Bây giờ câu hỏi của tôi là, khi CSS/JS này được thay đổi trong cơ sở dữ liệu, gói đó cần phải được "làm mới" để nội dung của các tệp đó được đọc lại vào gói.

Về cơ bản, tôi cần ASP.NET để tạo lại ma thuật/chuỗi ma thuật được nối vào URL gói.

Lý tưởng nhất, tôi chỉ muốn làm mới gói cụ thể, chứ không phải toàn bộ bảng gói.

Có cách nào để thực hiện việc này không?

EDIT:

Okay Vấn đề thứ hai, không thể tìm ra cách để thêm CSS động/JS để bó. bundle.AddFile có đường dẫn ảo đến tệp, nhưng đó không phải là tệp thực, đó là một chuỗi. Làm thế nào tôi sẽ làm điều này? Chắc chắn tôi không phải viết ra chuỗi các tập tin đầu tiên?

CHỈNH SỬA 2: Vì vậy, tôi đã quyết định không kết hợp nội dung động của mình. Đối với 2 lý do:

  1. Đó là chỉ có 1 tập tin, vì vậy tôi không đạt được bất cứ "bó" lợi ích
  2. Đóng bó được thiết kế cho nội dung tĩnh, đây không phải là

Vì vậy, những gì tôi đã được thực hiện bằng tay minified css/js động của tôi tại thời gian chạy (một lần, sau đó được lưu trữ). Bằng cách đó tôi có thể dễ dàng làm mới nó, bằng cách đơn giản xóa bộ nhớ cache.

đó đang được nói, đây vẫn là một câu hỏi có liên quan (làm mới bó) vì vậy tôi sẽ để nó mở ..

+0

Dường như một trình xử lý tùy chỉnh kích hoạt ra JS/CSS động có thể tốt hơn cho bạn. Đây là cách một số công cụ khác tạo ra JS tại thời gian chạy (ví dụ, Ajax.NET Pro thực hiện điều này: http://ajaxpro.codeplex.com/). Bạn có thể luân phiên sử dụng trang .aspx đơn giản trả về nội dung động và đặt tiêu đề bộ nhớ cache thành bộ nhớ cache để khách hàng yêu cầu nó mỗi lần. – nothingisnecessary

Trả lời

5

That "mà kỳ diệu guid/string" là một hash của các nội dung tập tin kết hợp.

Bạn có thể kiểm tra điều này bằng quy trình làm việc sau đây giả định rằng bạn có mybundle.css. Nếu bạn sử dụng Fiddler để xem giao thông, bạn sẽ thấy nó yêu cầu cái gì đó với một hash như

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Bây giờ, "chạm" một trong các tập tin trong gói nhiều như bạn muốn mà không thực sự thay đổi nội dung. Tệp mới hơn (LastModified/LastWrite là mới hơn), nhưng hàm băm vẫn không đổi vì nó được tính từ cùng một nội dung được kết hợp. Bạn thậm chí có thể thêm dấu cách vào tệp vì tệp sẽ được rút gọn.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Tiếp theo, thực sự thực hiện thay đổi.Có thể đặt đường viền thành 2px thay vì 1px. Hàm băm sẽ thay đổi ngay bây giờ, vì nội dung nạp băm đã thay đổi.

http://localhost:20206/mybundle.css?v=-4725541136976015445 

Cuối cùng, đặt đường viền trở lại như hình vẽ (trong ví dụ trên, quay lại 1px). "Chuỗi ma thuật" thực sự không phải là ngẫu nhiên hay ma thuật. Thay vào đó, nó trả về hàm băm một chiều phù hợp được tính từ nội dung.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Bây giờ bạn có thể yên tâm rằng bản băm sẽ chỉ cập nhật khi cần thiết mà không cần can thiệp thủ công.

Đối với các phần khác của câu hỏi của bạn,

khi CSS này/JS được thay đổi trong cơ sở dữ liệu, bó mà cần phải được "làm mới" để các nội dung của các tập tin được đọc lại vào gói .

Tôi nghĩ rằng chúng tôi chỉ đảo ngược suy nghĩ. Thay vì làm mới nhóm để kích hoạt đọc lại, chúng tôi cập nhật các tệp để kích hoạt làm mới. Khi ASP.NET thấy (các) tệp thay đổi, nó sẽ kết hợp lại nội dung và cập nhật băm.

+1

Tôi biết làm thế nào để làm điều này, nhưng tôi hỏi làm thế nào để làm điều đó ** lập trình **. Bạn có gợi ý tôi "chạm" tệp trong mã ứng dụng thực tế không? Ví dụ: Công cụ StreamWriter? – RPM1984

+0

Điểm của câu trả lời của tôi là bạn không cần phải làm những gì bạn nghĩ rằng bạn cần phải làm ... chuỗi không phải là "ma thuật". Bất cứ điều gì được bao gồm trong gói, nếu nó thay đổi, "chuỗi ma thuật" sẽ cập nhật dựa trên những nội dung đó. –

+0

Một liên lạc là không đủ, vì bạn thực sự cần thay đổi nội dung. Bạn có thể sử dụng 'StreamWriter' để lưu các nội dung đã thay đổi từ db vào các tệp vật lý, trong trường hợp đó, hàm băm sẽ tự xử lý. –

3

Tôi có tin tốt cho bạn. Nhiều người đã yêu cầu hỗ trợ nhà cung cấp đường dẫn ảo cho các kịch bản tương tự như của bạn, nơi họ có nội dung không nhất thiết phải từ đĩa, vì vậy chúng tôi hiện đang lên kế hoạch hỗ trợ VPP trong bản phát hành tiếp theo.

Để tận dụng lợi thế của hỗ trợ này, bạn sẽ phải triển khai VPP cho js/css động của bạn.

VPP cũng có các cơ chế phụ thuộc bộ đệm được tích hợp sẵn, vì vậy, chúng tôi có thể sử dụng các cơ chế đó để tự động xóa mục nhập bộ nhớ cache chính xác cho bạn.