Tôi biết câu hỏi này đã cũ, nhưng tôi muốn đăng câu trả lời dựa trên tình hình hiện tại của thế giới ASP.NET \ IIS kết hợp với kinh nghiệm thực tế của tôi.
Gần đây, tôi đã dẫn đầu một dự án tại công ty của mình, nơi tôi muốn hợp nhất và quản lý tất cả các cài đặt appSettings & connectionStrings trong tệp web.config của chúng tôi ở một nơi trung tâm. Tôi muốn theo đuổi cách tiếp cận trong đó cài đặt cấu hình của chúng tôi được lưu trữ trong ZooKeeper do tính ổn định và trưởng thành của dự án. Không đề cập đến thực tế rằng ZooKeeper là do thiết kế một ứng dụng quản lý cấu hình & cụm.
Các mục tiêu của dự án rất đơn giản;
- nhận ASP.NET để giao tiếp với ZooKeeper
- trong Global.asax, Application_Start - kéo cài đặt web.config từ ZooKeeper.
Sau khi vượt qua phần kỹ thuật để ASP.NET nói chuyện với ZooKeeper, tôi nhanh chóng tìm thấy và chạm vào một bức tường với đoạn mã sau;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Tuyên bố đó có ý nghĩa hợp lý nhất vì tôi muốn THÊM các cài đặt mới vào bộ sưu tập appSettings. Tuy nhiên, như người đăng ban đầu (và nhiều người khác) đã đề cập, lệnh gọi mã này trả về Lỗi cho biết rằng bộ sưu tập là Chỉ đọc.
Sau khi thực hiện một chút nghiên cứu và thấy tất cả những cách điên rồ khác nhau mà mọi người đã giải quyết vấn đề này, tôi đã rất nản lòng. Thay vì từ bỏ hoặc giải quyết cho những gì có vẻ là một viễn cảnh kém lý tưởng, tôi quyết định đào sâu và xem liệu mình có thiếu điều gì không.
Với một chút thử và sai, tôi thấy đoạn mã sau sẽ làm chính xác những gì tôi muốn;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Sử dụng dòng mã này, tôi hiện có thể tải tất cả 85 khóa appSettings từ ZooKeeper trong Application_Start của mình.
Liên quan đến các tuyên bố chung về các thay đổi đối với web.config kích hoạt tái chế IIS, tôi đã chỉnh sửa cài đặt appPool sau để theo dõi tình hình phía sau hậu trường;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Với sự kết hợp của các cài đặt, nếu quá trình này gây ra việc tái chế appPool, thì mục nhập Nhật ký sự kiện phải được ghi lại, mục nhập này thì không.
Điều này khiến tôi kết luận rằng có thể và thực sự an toàn, tải cài đặt ứng dụng từ phương tiện lưu trữ tập trung.
Tôi nên đề cập rằng tôi đang sử dụng IIS7.5 trên Windows 7. Mã sẽ được triển khai lên IIS8 trên Win2012. Nếu bất cứ điều gì liên quan đến câu trả lời này thay đổi, tôi sẽ cập nhật câu trả lời này cho phù hợp.