Cập nhật trang web .NET mà không cần tải lại


13

Tôi sử dụng để phát triển các trang web trong PHPASP classicvà nếu có điều gì cần phải được thay đổi. Bạn chỉ có thể thay đổi một / một vài tệp và không ai thực sự chú ý. Có lẽ nếu ai đó sẽ yêu cầu tệp đã thay đổi trong quá trình tải lên, nhưng đó chỉ là một nửa giây. Đối với hầu hết các trang web nhỏ hơn không có vấn đề.

Nhưng các trang web mới nhất được xây dựng cùng C# MVCvà khi bạn thay đổi mã, bạn cần xây dựng lại trang web của mình và tải lên các DLLtệp đã thay đổi . Nhưng khi bạn thay đổi DLLtập tin, nó sẽ khởi động lại trang web của bạn và thiết lập lại tất cả hoạt động sessions. Nó cũng phải tải lại mọi thứ và với các trang web lớn, có thể mất vài phút để tải mọi thứ. Mọi người đang duyệt trang web sẽ nhận thấy và cần phải đăng nhập lại.

Các cập nhật trang web lớn không phổ biến, vì vậy đó không phải là vấn đề. Nhưng chúng tôi có cập nhật "nhỏ" thường xuyên cho các chương trình khuyến mãi. Giống như 'Điền vào biểu mẫu này và nhận ba tháng miễn phí thành viên' hoặc '10 người đầu tiên tải lên hình ảnh của ... sẽ nhận được giá '. Tôi nghĩ bạn sẽ nhận được sự trôi dạt. Một số chương trình khuyến mãi tương tự và có thể được xử lý bằng một mô-đun hiển thị thông tin phù hợp dựa trên cài đặt, nhưng thường thì nó yêu cầu mã tùy chỉnh.

Tôi đã nghĩ đến một hệ thống trong đó mỗi khuyến mãi riêng của nó DLLtập tin dựa trên một giao diện, và sau đó nạp DLLtự động sử dụng Type.GetType, Activator.CreateInstanceInvokeMember. Mặc dù điều đó có thể làm việc, tôi tự hỏi liệu đó có phải là con đường đúng đắn.

Vì vậy, câu hỏi của tôi: Làm thế nào để bạn cập nhật một .NETtrang web một cách nhanh chóng, mà không tải lại toàn bộ trang web và bỏ phiên (như nhóm ứng dụng tái chế).


Đáp lại nhận xét về tiền thưởng của bạn: các trang web lớn tôi xử lý các thay đổi nhỏ để mã giống như cách họ xử lý các thay đổi lớn đối với mã: thông qua các bộ cân bằng tải và ngoài các phiên xử lý - bởi vì tất cả các mã được triển khai để trực tiếp cần phải trải qua một quá trình xem xét / đăng xuất và chúng tôi không thể bỏ mã trên các máy chủ. Tôi đoán định nghĩa của chúng tôi về "lớn" có thể không khớp;)
Zhaph - Ben Duguid

Câu trả lời:


11

Nhìn vào "Khởi tạo ứng dụng" IIS 7.5, Windows 2008 R2 (khó cài đặt hơn) IIS 8, Windows 2012

Khởi tạo ứng dụng cho phép mọi ứng dụng (nhóm ứng dụng không phải trang web) khởi động lại để chồng lấp và sử dụng ứng dụng cũ, vẫn đang chạy ứng dụng trước đó trong khi khởi động ứng dụng mới bắt đầu. Khi ứng dụng mới được tạo ra (được xác định bởi các URL bạn có thể đặt), ứng dụng sẽ bắt đầu sử dụng ứng dụng mới và tắt ứng dụng trước đó. Sử dụng Khởi tạo ứng dụng kết hợp với các phương pháp để đảm bảo phiên vẫn còn trên toàn bộ nhóm ứng dụng khởi động lại có thể cho phép trang web của bạn khởi động lại một cách liền mạch. (Zhaph có một lưu ý tốt về phím máy.)

Ngoài các liên kết ở trên về cấu hình Khởi tạo ứng dụng, bạn sẽ muốn xem xét điều gì kích hoạt khởi động lại trang - vì khởi động lại trang không sử dụng Khởi tạo ứng dụng, việc khởi động lại trang sẽ không liền mạch.

Bạn có thể định cấu hình IIS để bản cập nhật DLL không kích hoạt ngay lập tức khởi động lại trang web, cũng không thay đổi đối với web.config (giá trị ChangeNotification cao trên httpR.78 và các tệp cấu hình bên ngoài, có liên quan đến trang web của bạn).

Kết quả cuối cùng là bạn có thể cập nhật DLL / code mà không cần khởi động lại trang web, sau đó buộc khởi động lại ứng dụng sẽ sử dụng nền khởi động AppInitialization để thay đổi mã liền mạch.

Làm những điều này trong buổi hòa nhạc hoạt động khá tốt để khởi động lại liền mạch.


Một bộ tốt các bước ở đó - chắc chắn là một cái gì đó để xem xét :)
Zhaph - Ben Duguid

Điều này nghe giống như những gì tôi đang tìm kiếm. Sẽ cho nó một thử và thiết lập nó. Cảm ơn
Hugo Delsing

@HugoDelsing Hy vọng nó hoạt động tốt cho bạn.
jeffreypriebe

Cảm ơn bạn, đây là những gì tôi đã sử dụng và nó hoạt động rất tốt.
Hugo Delsing

@HugoDelsing Vui mừng khi biết nó cũng làm việc cho bạn.
jeffreypriebe

5

Có một số cách để xử lý những gì bạn yêu cầu và một số khía cạnh khác nhau cho câu hỏi của bạn:

Xử lý các cập nhật nhỏ cho các chương trình khuyến mãi

Những gì bạn thực sự ở đây là một hệ thống quản lý nội dung hoặc tương tự cho phép bạn chỉnh sửa nội dung một cách nhanh chóng (nghĩ Wordpress / Drupal hoặc từ quan điểm .NET N2 CMS, Umbraco, Orchard, v.v.), tuy nhiên là một số điều bạn có thể thử nếu bạn chưa đi theo con đường đó.

Bởi vì ASP.NET chỉ thực sự load lại nếu bạn chạm vào một số loại tập tin (web.config (s), các nội dung của /bin//app_code/thư mục chủ yếu) - và có một giới hạn cấu hình cho "thay đổi tập tin khác" (về cơ bản khi bạn đã sửa đổi để nhiều tệp trong trang web của bạn, nhóm ứng dụng sẽ khởi động lại - NumRecompilesBeforeAppRestart) bạn có thể xem xét việc thực hiện một cái gì đó trong đó bạn kiểm tra một thư mục khác cho một số .htmltệp tĩnh (tức là ) mà bạn kéo vào và hiển thị khi cần hoặc sử dụng LoadControlphương thức có đường dẫn chuỗi một .ascxđiều khiển người dùng và tự động tải nó - cách bạn xác định sẽ hiển thị câu hỏi nào khác phù hợp hơn với StackOverflow - tuy nhiên tôi khuyên bạn nên sử dụng giải pháp dựa trên quy ước đặt tên.

Bạn cũng có thể xem xét việc sử dụng một cái gì đó như Khung mở rộng được quản lý (MEF - đã là một phần đầy đủ của khung .NET kể từ phiên bản 4) cho phép bạn viết một kiến ​​trúc dựa trên plugin và chỉ định một thư mục bên ngoài thư mục của bạn /bin/để theo dõi .DLL mới - mặc dù tôi chưa thử điều này để xem liệu nó có tránh được sự cố khởi động lại ứng dụng hay không, tôi đã sử dụng điều này để có hiệu quả tốt trong môi trường web để thêm chức năng chung vào trang web.

Nếu điều đó không hấp dẫn, thì lựa chọn duy nhất khác mà tôi có thể nghĩ đến là thêm các điều khiển dưới dạng "code-in-front" như chúng ta đã làm trong ASP cổ điển - tức là với một <script runat="server">khối thay vì một lớp "code-đằng sau" được biên dịch có chứa logic để chạy điều khiển - điều này sẽ loại bỏ sự cần thiết phải thay đổi DLL, với chi phí mất một số hiệu suất lần đầu tiên khi điều khiển được biên dịch nhanh chóng - một lần nữa bạn sẽ cần phải cân bằng điều này với NumRecompilesBeforeAppRestartnếu bạn Tôi đang làm rất nhiều thay đổi nhỏ.

Làm cách nào để duy trì các phiên trên ứng dụng khởi động lại?

Đây có thể là một vấn đề dễ dàng hơn để giải quyết và bao gồm ba bước chính:

  1. Định cấu hình MachineKey (IIS7, nhưng vẫn giữ 8) là giá trị không đổi thay vì AutoGenerate- điều này có nghĩa là khi AppPool tái chế, nó sẽ sử dụng cùng một khóa và do đó sẽ có thể giải mã cookie phiên, chế độ xem, v.v. tái chế.
  2. Hoặc thiết lập một máy chủ Nhà nước hoặc cấu hình một cơ sở dữ liệu để tổ chức phiên Nhà nước .
  3. Chuyển từ sử dụng InProcsang StateServerhoặc SQLServertrong phần tử SessionState trong web.config.

Bằng cách này, bạn sẽ có các phiên liên tục tồn tại khi khởi động lại ứng dụng. Tuy nhiên, những thứ này không "miễn phí" - mọi thứ bạn lưu trữ trong phiên bây giờ phải được tuần tự hóa và bạn sẽ phải chịu một cú đánh hiệu suất nhẹ vì mỗi lần tải trang sẽ yêu cầu các chuyến đi mạng bổ sung để có được và có khả năng giải phóng dữ liệu phiên.

Tuy nhiên, nếu bạn ở vị trí cần "vài phút" để ứng dụng khởi động lại sau khi triển khai, bạn có thể muốn xem xét chuyển sang môi trường cân bằng tải hoặc ít nhất là thiết lập Staging / Live có thể tráo đổi (chẳng hạn như được cung cấp bởi Azure / AWS / v.v.) - bằng cách này bạn có thể đưa máy chủ ngoại tuyến trong khi cập nhật hoặc sẵn sàng với mã mới và sau đó trao đổi nó - với điều kiện bạn đã thực hiện các bước để chia sẻ địa chỉ phiên (xem ở trên) điều này sẽ hoạt động tốt mà không ảnh hưởng đến người dùng của bạn.


Cảm ơn bạn đã trả lời dài của bạn. Thật không may, CMSkhông phải những gì tôi muốn. Tôi không muốn thay đổi nội dung, tôi muốn thay đổi mã. Phần về các phiên chỉ là một ví dụ. Thay đổi nó sẽ không giải quyết được vấn đề trang web bị hỏng trong một hoặc hai phút khi tải lại DLLtệp. Phần MEFnày rất thú vị, nhưng là một giải pháp của bên thứ ba cho hệ thống mà tôi đã nghĩ đến. Vì vậy, +1 cho nỗ lực, nhưng thật không may, nó không thực sự là một câu trả lời cho câu hỏi của tôi.
Hugo Delsing

1
Tôi đã cập nhật câu trả lời của mình để giải quyết một vài điểm sau: MEF được phát hành bởi MS và là một phần đầy đủ của .NET framework kể từ v4. Bạn có thể thử sử dụng mã phía trước cho các điều khiển mới của mình, thay vào đó áp dụng cài đặt cân bằng tải / dàn dựng trực tiếp để có thể khởi động máy chủ và chạy và sau đó trao đổi nó.
Zhaph - Ben Duguid

1
Tôi đã phác thảo một giải pháp thay thế bằng cách sử dụng Khởi tạo ứng dụng. Lợi ích là tất cả các thiết lập mã và máy chủ là "bình thường" mà không cần điều khiển tải cân bằng hoặc tải động đặc biệt, giữ cho môi trường chạy của bạn đơn giản hơn. Tất nhiên, thiết lập cân bằng tải / dàn dựng trực tiếp có thể hữu ích cho các lý do khác.
jeffreypriebe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.