2009-04-06 36 views
73

Tôi đang bối rối về cách sửa đổi giá trị app.config appSettings khi chạy. Ví dụ: tôi có phần appSettings này:Làm cách nào để bạn sửa đổi cài đặt ứng dụng web.config khi chạy?

<appSettings> 
    <add key="productspagedesc" value="TODO: Edit this default message" /> 
    <add key="servicespagedesc" value="TODO: Edit this default message" /> 
    <add key="contactspagedesc" value="TODO: Edit this default message" /> 
    <add key="aboutpagedesc" value="TODO: Edit this default message" /> 
    <add key="homepagedesc" value="TODO: Edit this default message" /> 
</appSettings> 

Giả sử, tôi muốn sửa đổi khóa "homepagedesc" khi chạy. Tôi đã thử ConfigurationManager và WebConfigurationManager các lớp tĩnh, nhưng các thiết lập là "chỉ đọc". Làm cách nào để sửa đổi giá trị appSettings khi chạy?

CẬP NHẬT: Ok, vậy tôi ở đây 5 năm sau. Tôi muốn chỉ ra rằng trải nghiệm đã cho tôi biết, chúng tôi không nên đặt bất kỳ cấu hình nào có chủ ý có thể chỉnh sửa trong thời gian chạy trong tệp web.config nhưng thay vào đó chúng ta nên đặt nó trong một tệp XML riêng biệt như một trong những người dùng đã nhận xét bên dưới. Điều này sẽ không yêu cầu bất kỳ chỉnh sửa của tập tin web.config để khởi động lại ứng dụng mà sẽ kết quả với người dùng tức giận gọi cho bạn.

+0

Đây là một liên kết tốt giải thích độc đáo về việc sửa đổi web.config t thời gian chạy và tác động của nó trong ứng dụng. [http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html](http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at- runtime.html) –

+5

@ user330004 liên kết bạn cung cấp không còn hợp lệ – McArthey

+0

Chỉ mất vài giây để tìm [phiên bản đã lưu trữ] (http://web.archive.org/web/20111217082254/http://aspdotnethacker. blogspot.com/2010/05/modify-webconfig-file-at-runtime.html)! – stuartd

Trả lời

75

Bạn cần phải sử dụng WebConfigurationManager.OpenWebConfiguration(): Ví dụ:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~") 
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text 
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text 
myConfiguration.Save() 

Tôi nghĩ bạn cũng có thể cần phải thiết lập AllowLocation trong Machine.config. Đây là giá trị boolean cho biết liệu các trang riêng lẻ có thể được định cấu hình bằng phần tử hay không. Nếu "allowLocation" là false, nó không thể được cấu hình trong các phần tử riêng lẻ.

Cuối cùng, nó tạo sự khác biệt nếu bạn chạy ứng dụng của mình trong IIS và chạy mẫu thử của bạn từ Visual Studio. Quá trình nhận dạng ASP.NET là tài khoản IIS, ASPNET hoặc NETWORK SERVICES (tùy thuộc vào phiên bản IIS).

Có thể cần cấp quyền truy cập cho ASPNET hoặc NETWORK SERVICES Modify vào thư mục chứa tệp web.config.

+1

Cảm ơn bạn đã phản hồi Mitch. Bạn đã trả lời câu hỏi của tôi. Những gì tôi đã làm là tôi chạy VS 2008 với tư cách là Quản trị viên và mọi thứ đều ổn. – jerbersoft

22

Thay đổi web.config thường khiến ứng dụng khởi động lại.

Nếu bạn thực sự cần ứng dụng của mình để chỉnh sửa cài đặt riêng, thì bạn nên xem xét một cách tiếp cận khác như databasing cài đặt hoặc tạo tệp xml với cài đặt có thể chỉnh sửa.

+1

Xin chào, cảm ơn bạn đã phản hồi. Nhưng có lớp "Cấu hình" này có chức năng "Lưu". Bạn có thực sự phải khởi động lại ứng dụng để cài đặt mới hoạt động không? – jerbersoft

+4

Thay đổi web.config sẽ tự động kích hoạt một ứng dụng khởi động lại. –

+1

Không nên thay đổi web.config động. Tôi muốn lưu trữ giá trị trong tệp (xml). –

16

Đây là một giải pháp tốt hơn cho kịch bản này (thử nghiệm Với Visual Studio 2008):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); 
config.AppSettings.Settings.Remove("MyVariable"); 
config.AppSettings.Settings.Add("MyVariable", "MyValue"); 
config.Save(); 

Cập nhật 2018 =>
Tested trong vs 2015 - Asp.net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
config.AppSettings.Settings["MyVariable"].Value = "MyValue"; 
config.Save(); 

nếu bạn cần t o kiểm tra yếu tố tồn tại, sử dụng mã này:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
if (config.AppSettings.Settings["MyVariable"] != null) 
{ 
config.AppSettings.Settings["MyVariable"].Value = "MyValue"; 
} 
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); } 
config.Save(); 
+0

Bạn có thể giải thích một chút tại sao nó tốt hơn không? Tôi biết công cụ configSection đôi khi là một chút khôn lanh. – julealgon

+0

Mã này nhỏ hơn và dễ hiểu hơn! Ít nhất là cho tôi. –

+3

Ồ, đó là vì sở thích cá nhân sau đó, tôi thực sự nghĩ rằng nó là một cách hợp lý khác nhau bằng cách nào đó. Tôi rất không đồng ý với bạn trong trường hợp này mặc dù vì một lý do thực sự: đầu tiên bởi vì bạn phải chỉ định cùng một khóa hai lần, thứ hai bởi vì những gì bạn đang làm là ngữ nghĩa khác với những gì thực sự cần thiết ('update' vs 'remove-> thêm ') và thứ ba vì mã thực sự dài hơn (không chắc chắn tại sao bạn lại làm điều này ở đây) và mở ra những sai lầm. Ngoài ra, nếu một số lý do mã của bạn không thành công giữa các cuộc gọi? Ứng dụng của bạn bị hỏng từ đó tôi nghĩ. – julealgon

21

Và nếu bạn muốn tránh khởi động lại của ứng dụng, bạn có thể di chuyển ra khỏi các appSettings phần:

<appSettings configSource="Config\appSettings.config"/> 

vào một tập tin riêng biệt.Và kết hợp với ConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
config.Save(ConfigurationSaveMode.Minimal); 

bạn có thể tiếp tục sử dụng phần appSettings như các cửa hàng cho cài đặt khác nhau mà không gây ra khởi động lại ứng dụng và không có nhu cầu sử dụng một tập tin với một định dạng khác so với phần appSettings bình thường.

11

Tôi biết câu hỏi này là cũ, nhưng tôi muốn đăng câu trả lời dựa trên tình trạng hiện tại của công việc trong 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 appConnection & connectionStrings trong tệp web.config của chúng tôi ở một vị trí trung tâm. Tôi muốn theo đuổi một cách tiếp cận, nơi cài đặt cấu hình của chúng tôi được lưu trữ trong ZooKeeper do các dự án đáo hạn & ổn định. Chưa kể thực tế rằng ZooKeeper là do thiết kế một cấu hình ứng dụng quản lý cluster &.

Mục tiêu của dự án rất đơn giản;

  1. get ASP.NET để giao tiếp với Zookeeper
  2. trong Global.asax, Application_Start - kéo các thiết lập web.config từ Zookeeper.

Khi nhận được thông tin kỹ thuật về ASP.NET để nói chuyện với ZooKeeper, tôi nhanh chóng tìm thấy và nhấn vào tường với mã sau;

ConfigurationManager.AppSettings.Add(key_name, data_value) 

Tuyên bố hợp lý nhất vì tôi muốn ADD cài đặt mới vào bộ sưu tập appSettings. Tuy nhiên, với tư cách là người đăng ban đầu (và nhiều người khác) được đề cập, lệnh gọi mã này trả về một lỗi nói rằng bộ sưu tập là chỉ đọc.

Sau khi thực hiện một số nghiên cứu và nhìn thấy tất cả những cách khác nhau điên rồ mọi người làm việc xung quanh 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ì dường như là một kịch bản ít hơn lý tưởng, tôi quyết định đào sâu vào và xem nếu tôi đã bỏ lỡ một cái gì đó.

Với một chút thử và sai, tôi thấy mã sau sẽ thực hiện 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, giờ đây tôi có thể tải tất cả 85 khóa ứng dụngCài đặt từ ZooKeeper trong ứng dụng của tôi_Start.

Liên quan đến báo cáo chung về các thay đổi đối với web.config kích hoạt IIS tái chế, tôi đã chỉnh sửa cài đặt ứng dụng sau để theo dõi tình huống đằng 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ày, nếu quá trình này là nguyên nhân gây ra tái chế ứng dụng, mục ghi nhật ký sự kiện phải được ghi lại.

Điều này dẫn tôi đến kết luận rằng có thể 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 đến IIS8 trên Win2012. Bất cứ điều gì liên quan đến sự thay đổi câu trả lời này, tôi sẽ cập nhật câu trả lời này cho phù hợp.

+0

Điều này có thể vừa mới tiết kiệm cho tôi một vài giờ. Cám ơn rất nhiều! –

+0

Bạn được chào đón. – Sage

2

Ai thích trực tiếp vào vấn đề,

Trong Config của bạn

<appSettings> 

    <add key="Conf_id" value="71" /> 

    </appSettings> 

trong mã của bạn (C#)

///SET 
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue"); 
     ///GET    
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString(); 
0

Hãy thử này:

using System; 
using System.Configuration; 
using System.Web.Configuration; 

namespace SampleApplication.WebConfig 
{ 
    public partial class webConfigFile : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      //Helps to open the Root level web.config file. 
      Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~"); 
      //Modifying the AppKey from AppValue to AppValue1 
      webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString"; 
      //Save the Modified settings of AppSettings. 
      webConfigApp.Save(); 
     } 
    } 
} 
Các vấn đề liên quan