Tôi có một ứng dụng web ASP.NET (.NET Framework 4.7.2.) được triển khai cho AWS/ECS và chúng tôi nhận thấy Application_Start không chạy một lần, không phải hai lần mà là ba lần! Có thể những người khác đang phải đối mặt với vấn đề này.
Chúng tôi đã giải quyết 1 trong 2 lần khởi động lại. Điều đầu tiên xảy ra vì điểm vào docker của Microsoft Dịch vụMàn hình của hành động đầu tiên là dừng dịch vụ w3svc, thay đổi applicationHost.config (thông qua appcmd.exe) để đưa các biến môi trường cấp docker (các biến được cung cấp qua chỉ thị ENV trong tệp docker hoặc thông qua tham số dòng lệnh docker run) vào phần biến môi trường của DefaultAppPool rồi khởi động lại dịch vụ.
Thông thường, đó không phải là vấn đề, nhưng nếu các ứng dụng của bạn được đặt ở chế độ tự động khởi động với preloadEnabled=true, thì điều xảy ra là dịch vụ sẽ tự động khởi động một lần với bộ chứa, chỉ khi ServiceMonitor xuất hiện và dừng dịch vụ đó, thay đổi cài đặt và khởi động lại. Vì vậy, lần chạy ban đầu do hệ thống bắt đầu sẽ bị tiêu diệt và không nên xảy ra ngay từ đầu. Nó không có tất cả các biến môi trường dự kiến và nó thực sự chỉ chạy vì ứng dụng được đặt ở chế độ tự động khởi động. Chúng tôi đã giải quyết vấn đề đó bằng cách đặt chế độ khởi động w3svc thành 'Thủ công'. Điều này ngăn việc chạy Application_Start ban đầu bị hủy hoại, do đó, ít nhất là trong bộ chứa docker cục bộ, chúng tôi chỉ nhận được một lần chạy ứng dụng khởi động duy nhất, được bắt đầu sau khi ServiceMonitor đã áp dụng các cài đặt phù hợp.
Mọi thứ có một chút khác biệt trong ECS. Ngoài lần chạy khởi động bổ sung do ServiceeMonitor kích hoạt, chúng tôi cũng có một lần chạy khác (thứ 3) được kích hoạt bởi một số cài đặt khác được áp dụng trong thời gian chạy có lẽ là do môi trường ECS. Câu hỏi chính của tôi là, có ai biết những thay đổi cài đặt do ECS khởi xướng này có thể là gì không? ECS có đang áp dụng các biến môi trường theo cách nào đó hoặc thực hiện các thay đổi khác đối với IIS theo mặc định không? Đây là điều chỉ xảy ra trong ECS mà không xảy ra khi cùng một hình ảnh docker được chạy cục bộ trên máy tính để bàn docker.
Bất kể những thay đổi cài đặt này là gì, chúng đặc biệt gây rối, bởi vì chúng không kích hoạt quá trình tái chế quy trình chồng chéo bình thường để tạo ra một quy trình mới, riêng biệt được khởi động trước khi thay thế quy trình cũ. Ví dụ: những thay đổi cài đặt này kích hoạt kiểu tái chế trong quá trình mà bạn sẽ nhận được nếu bạn sửa đổi tệp web.config. Tôi nghĩ điều này sẽ thay thế AppDomain trong quy trình đã chạy. Điều này có hại cho chúng tôi, bởi vì chúng tôi đang chạy các thư viện theo dõi cấp thấp SignalFx kết nối với CLR và điều này gây ra vi phạm chia sẻ làm hỏng quy trình khi AppDomain mới cố tải các tập hợp miền trung lập với các quyền khác nhau. Tất cả các chu kỳ khởi động ứng dụng bổ sung này không chỉ gây thêm tải cho hệ thống vì nó đang thực hiện gấp ba lần mọi thứ (bao gồm hydrat hóa bộ nhớ cache từ cơ sở dữ liệu, thiết lập đăng ký chủ đề Azure, v.v.), mà còn đặt thêm nhu cầu bộ nhớ cho hệ thống có thể dẫn đến các ngoại lệ OutOfMemory, đặc biệt là trong docker nơi chứa có giới hạn bộ nhớ cứng.