Thành thật mà nói, tôi đã cố gắng biến một mánh khóe bẩn thỉu trên IIS và ngay khi tôi nghĩ rằng mình sẽ thoát khỏi nó, tôi nhận ra cách giải quyết của mình không hiệu quả. Đây là những gì tôi đã cố gắng làm:
1) Tôi có ứng dụng ASP.NET có lớp Preloader kế thừa IProcesshostPreloadClient và thực hiện tất cả các khởi tạo nặng trong Preload triển khai phương thức (ứng dụng rất phức tạp và là một phần của hệ thống khổng lồ, vì vậy cần khoảng 2 phút để thiết lập kết nối với tất cả dịch vụ và khởi tạo trước một số đăng ký Unity).
2) Tôi có rất nhiều việc cần phải thực hiện khi tắt ứng dụng (hủy đăng ký, ngắt kết nối, hủy, ...) và tôi đoán nơi tốt nhất để thực hiện là trong phương thức * Application_End * nằm trong Global.asax .
3) Mọi thứ chỉ hoạt động tốt khi tôi có hoạt động của người dùng (yêu cầu đầu tiên sau khi Nhóm ứng dụng chứa ứng dụng web đã nói ở trên được khởi động sẽ khiến * Application_Start * được gọi và sau đó * Application_End * được gọi trong Dừng ứng dụng hoặc tái chế), nhưng sự cố xảy ra khi không có hoạt động người dùng và ứng dụng cố gắng tự khởi động lại sau khi hoạt động trong 48 giờ (yêu cầu được định cấu hình). Vì không có yêu cầu, ứng dụng chính thức không được bắt đầu. Ergo, nó không thể dừng lại một cách duyên dáng vì * Application_End * sẽ không được gọi.
4) Bây giờ đến phần lộn xộn ... Tôi đã thử thực hiện một yêu cầu GET từ mã ở cuối phương thức Preload và nó đã hoạt động. Nhưng giải pháp này có vẻ tệ với tôi, mặc dù nó có hiệu quả. Vì vậy, tôi đã thử rất nhiều thứ, và điều cuối cùng tôi đã thử là:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... Và điều đó đã hoàn thành mục đích của nó. * Application_Start * đã được gọi, (Tôi đã kiểm tra phản hồi, nó chứa trang đăng nhập được cho là hiển thị trong yêu cầu ban đầu) và trên ứng dụng tắt ứng dụng Pool đã kết thúc một cách duyên dáng bằng cách thực hiện công việc cần thiết trong * Application_End *.
NHƯNG
Sau khi ứng dụng được khởi động (tải sẵn và khởi tạo) theo cách này, đây là điều đã xảy ra khi tôi muốn tiếp cận ứng dụng qua trình duyệt Web:
Lỗi HTTP 500,21 - Trình xử lý lỗi máy chủ nội bộ "ExtensionlessUrlHandler-Integration-4.0" có một mô-đun xấu "ManagedPipelineHandler" trong danh sách mô-đun của nó
Tôi không thể tìm ra điều này. Bất cứ ai có thể cho tôi biết tại sao điều này xảy ra và làm thế nào để khắc phục nó?
Nếu tôi không tìm ra điều này, tôi sẽ quay lại giải pháp đầu tiên (gửi yêu cầu GET từ mã) nhưng vấn đề này sẽ gây ra lỗi cho tôi vì tôi thậm chí không biết mình đã làm gì sai.