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/
và /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ố .html
tệ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 LoadControl
phươ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 NumRecompilesBeforeAppRestart
nế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:
- Đị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ế.
- 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 .
- Chuyển từ sử dụng
InProc
sang StateServer
hoặc SQLServer
trong 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.