Làm cách nào để bạn sửa đổi cài đặt web.config appSettings trong thời gian chạy?


84

Tôi bối rối về cách sửa đổi các giá trị appSettings của web.config trong thời gian chạy. Ví dụ, tôi có phần Cài đặt ứng dụng nà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" trong thời gian chạy. Tôi đã thử các lớp tĩnh ConfigurationManager và WebConfigurationManager, nhưng cài đặt là "chỉ đọc". Làm cách nào để sửa đổi các giá trị appSettings trong thời gian chạy?

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


Đây là một liên kết tốt giải thích độc đáo về việc sửa đổi web.config trong 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

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

Chỉ mất vài giây để tìm thấy phiên bản lưu trữ !
stuartd

Câu trả lời:


84

Bạn cần 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 đặt AllowLocation trong machine.config. Đây là một giá trị boolean cho biết liệu các trang riêng lẻ có thể được định cấu hình bằng cách sử dụng phần tử hay không. Nếu "allowLocation" là false, nó không thể được định cấu hình trong các phần tử riêng lẻ.

Cuối cùng, sẽ tạo ra 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ử nghiệm của bạn từ Visual Studio. Nhận dạng quy trình ASP.NET là tài khoản IIS, ASPNET hoặc DỊCH VỤ MẠNG (tùy thuộc vào phiên bản IIS).

Có thể cần cấp ASPNET hoặc DỊCH VỤ MẠNG Sửa đổi quyền truy cập vào thư mục chứa web.config.


1
Cảm ơn vì đã trả lờ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 Quản trị viên và mọi thứ đều ổn.
jerbersoft

Có lẽ rõ ràng đối với những người khác (không phải với tôi), câu trả lời này, cũng như của Amin về chức năng giống nhau, thực sự ghi đè tệp web.config vật lý của bạn, không chỉ ghi đè cài đặt trong bộ nhớ cho phiên bản đang chạy cụ thể.
k3davis

24

Thay đổi web.config thường gây ra khởi động lại ứng dụng.

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 của nó, thì bạn nên xem xét một cách tiếp cận khác như lập cơ sở dữ liệu cài đặt hoặc tạo tệp xml với cài đặt có thể chỉnh sửa.


1
Hi, nhờ các phản ứng. 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 tự động kích hoạt khởi động lại ứng dụng.
Mike Cole

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

Ai đó có thể giải thích tại sao việc khởi động lại ứng dụng là không tốt và nhiều người khuyên bạn nên di chuyển thuộc tính sang một tệp khác?
Ben

1
@Ben - Tôi biết là đã vài tháng kể từ đó, nhưng đề phòng - việc khởi động lại ứng dụng có nghĩa là bất kỳ ai đăng nhập vào ứng dụng của bạn tại thời điểm khởi động lại sẽ tự động bị đăng xuất và rất có thể gặp lỗi. (các tình huống khác nhau chẳng hạn như trang trại web ...). người dùng tức giận liên hệ hỗ trợ, hỗ trợ danh bạ bạn vv vv vv ...
Fetchez la vache

24

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

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

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

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

bạn có thể tiếp tục sử dụng appSettingsphần này làm nơi lưu trữ các cài đặt khác nhau mà không gây khởi động lại ứng dụng và không cần sử dụng tệp có định dạng khác với phần appSettings bình thường.


21

2012 Đây là giải pháp tốt hơn cho trường hợp 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 =>
Đã thử nghiệm so với 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 kiểm tra phần tử tồn tại, hãy 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();

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

1
Mã này nhỏ hơn và dễ hiểu hơn! Ít nhất là đối với tôi.
Amin Ghaderi,

3
Ồ, đó là do sở thích cá nhân, tôi thực sự nghĩ rằng nó khác về mặt logic bằng cách nào đó. Tôi thực sự không đồng ý với bạn trong trường hợp này mặc dù vì một số lý do thực sự: thứ nhất vì bạn phải chỉ định cùng một khóa hai lần, thứ hai vì những gì bạn đang làm khác về ngữ nghĩa so 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 tại sao bạn lại làm điều khác ở đây) và dễ xảy ra sai sót. Ngoài ra, nếu vì lý do nào đó mà mã của bạn bị lỗi giữa các cuộc gọi thì sao? Tôi nghĩ ứng dụng của bạn bị hỏng từ đó.
julealgon

2
Mã này xóa bất kỳ anh chị em nhận xét nào đối với MyVariable.
blagus

Đúng chính xác ! Mã code này được viết lại tất cả các biến, nhưng nó hoạt động. nhưng tôi không Đề nghị sử dụng nó, khi bạn sử dụng mã nhận xét. Cảm ơn bạn.
Amin Ghaderi

14

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;

  1. nhận ASP.NET để giao tiếp với ZooKeeper
  2. 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.


Điều này có lẽ chỉ tiết kiệm cho tôi một vài giờ. Cám ơn rất nhiều!
Drew Delano

4

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

Trong cấu hình 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

Thử đi:

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();
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.