2012-05-16 32 views
15

Tôi có một vai trò web Windows Azure có chứa một trang web bằng cách sử dụng ASP.NET MVC. Khi một yêu cầu HTTP đến và trang được tải lần đầu tiên (.aspx hoặc .cshtml) được biên soạn và mất một khoảng thời gian và do đó, lần đầu tiên trang được phân phối phải mất nhiều thời gian hơn sau khi phân phát cùng một trang.Làm cách nào để buộc biên dịch chế độ xem ASP.NET MVC?

Tôi đã bật <MvcBuildViews> (được mô tả in this answer) để thực thi xác nhận thời gian biên dịch của chế độ xem, nhưng điều đó dường như không ảnh hưởng đến quá trình biên dịch khi trang web được triển khai và chạy.

Vai trò web Azure có cái gọi là nhiệm vụ khởi động và cũng là phương pháp đặc biệt OnStart() nơi tôi có thể đặt bất kỳ mã khởi động nào, vì vậy khi tôi biết phải làm gì thêm vào vai trò thì không phải là vấn đề.

Có cách nào để buộc tổng hợp tất cả các chế độ xem không?

Trả lời

7

Hóa ra có ASP.NET Precompilation có thể được thực hiện bằng ClientBuildManager.PrecompileApplication và bắt chước các hành vi biên soạn theo yêu cầu, nhưng chỉ cần biên dịch mỗi trang. Đã thử nó - tải đầu tiên trông đáng chú ý nhanh hơn.

Phần không tầm thường là nội dung để chuyển thành các tham số khởi tạo ClientBuildManager. Giải pháp là liệt kê tất cả các đối tượng .Applications của đối tượng Site và cho mỗi mục trong .Applications liệt kê tất cả .VirtualDirectories và sử dụng PathVirtualPath từ mỗi mục làm tham số cho ClientBuildManager hàm tạo.

+0

Bạn tạo chuỗi nào làm tham số khi tạo lớp 'ClientBuildManager'? – trailmax

+1

@trailmax: Tôi nhận được đối tượng 'VirtualDirectory' của ứng dụng và từ đó tôi nhận được' Đường dẫn' đi theo tham số đầu tiên và 'PhysicalPath' đi theo tham số thứ hai. – sharptooth

14

Hãy xem Precompiled Razor Views by David Ebbo

Tại sao bạn sẽ muốn làm điều đó?

Một lý do để làm điều này là tránh bất kỳ lần truy cập thời gian chạy nào khi trang web của bạn bắt đầu, vì không còn gì để biên dịch khi chạy. Điều này có thể là quan trọng trong các trang web có nhiều lượt xem.

Ngoài ra, bạn không còn cần phải triển khai các tệp cshtml nữa, kết quả là trong một tập tệp triển khai nhỏ hơn.

Một lợi ích thú vị khác là nó cung cấp cho bạn khả năng kiểm tra đơn vị lượt xem của bạn, điều luôn luôn khó khăn với mô hình biên dịch thời gian chạy chuẩn . Tôi sẽ trình bày chi tiết hơn trong bài đăng trong tương lai.

+0

Thao tác này có cho .aspx không? – sharptooth

+0

Tôi không chắc chắn, vì tôi đã sử dụng nó chỉ cho Razor xem – archil

3

Đây có phải là vấn đề ban đầu hoặc vấn đề ổn định không? Một vấn đề được thấy là việc tái chế hồ bơi ứng dụng, mặc định là thời gian chờ 20 phút. Nếu bạn tắt thời gian chờ (hoặc đặt nó thành một thứ gì đó lớn), đó có phải là giải pháp hợp lệ không?

Đây là another SO answer thảo luận về thời gian chờ của AppPool và cách tắt tính năng này. Về cơ bản:

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 
+0

Đây là một vấn đề khác mà tôi không có ý tưởng. Cảm ơn rất nhiều. Tuy nhiên tôi hỏi về việc biên dịch các khung nhìn ASP.NET thành mã thực thi và vẫn phải được thực hiện bất kể apppool có được tái chế hay không. Bạn có bất kỳ ý tưởng về lý do tại sao có một tái chế ở nơi đầu tiên? Tôi có nghĩa là tôi triển khai một vai trò web để có một trang web mọi lúc. Tại sao nó được tái chế? – sharptooth

+0

Tái chế AppPool giống với tái chế Windows Server AppPool. Tôi đã nhìn thấy đối số cho việc thay đổi điều này cho Windows Azure, nhưng sau đó sẽ có một sự không thống nhất giữa Windows Server trên và trong Windows Azure, và mục tiêu là để giữ cho mọi thứ nhất quán. Trong trường hợp có lưu lượng truy cập cao, có thể bạn không gặp vấn đề về tái chế. Đủ dễ dàng để điều chỉnh bằng mã ở trên và hoạt động tương tự, cho dù là ở trên hay trong đám mây. –

0

Thêm phần này vào OnStart:

using (var serverManager = new ServerManager()) 
     { 
      string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_" + "Web"; 
      var siteId = serverManager.Sites[siteName].Id; 
      var appVirtualDir = $"/LM/W3SVC/{siteId}/ROOT"; // Do not end this with a trailing/

      var clientBuildManager = new ClientBuildManager(appVirtualDir, null, null, 
             new ClientBuildManagerParameter 
             { 
              PrecompilationFlags = PrecompilationFlags.Default, 
             }); 

      clientBuildManager.PrecompileApplication(); 
     } 
0

Nếu bạn sử dụng functionnality Xuất bản của Visual Studio, có một lựa chọn đơn giản hơn nhiều:

Trên Publish thoại>Cài đặt cửa sổ, mở rộng Tùy chọn xuất bản tệp và kiểm tra Biên dịch ngược trong khi xuất bản sau đó nhấp vào định cấu hình. Trên hộp thoại Cài đặt biên dịch nâng cao, bỏ chọnCho phép trang web biên dịch sẵn có thể cập nhật.

nguồn: https://msdn.microsoft.com/en-us/library/hh475319.aspx

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