Đọc cài đặt từ app.config hoặc web.config trong .NET


807

Tôi đang làm việc trên thư viện lớp C # cần có khả năng đọc các cài đặt từ tệp web.confighoặc app.configtệp (tùy thuộc vào việc DLL được tham chiếu từ ứng dụng web ASP.NET hay ứng dụng Windows Forms).

Tôi đã thấy rằng

ConfigurationSettings.AppSettings.Get("MySetting")

hoạt động, nhưng mã đó đã bị Microsoft đánh dấu là không dùng nữa.

Tôi đã đọc rằng tôi nên sử dụng:

ConfigurationManager.AppSettings["MySetting"]

Tuy nhiên, System.Configuration.ConfigurationManagerlớp dường như không có sẵn trong dự án Thư viện lớp C #.

Cách tốt nhất để làm việc này là gì?


48
Giống như tôi đã đọc 4 ví dụ và bài viết về MSDN .. Và đã hạ cánh ở đây. Chỉ cần thêm một tài liệu tham khảo .. tại sao họ không thể nói như vậy. Câu hỏi hay! +1
Piotr Kula

1
Nếu bạn cũng muốn viết lại các cài đặt , hãy xem ở đây cách bạn có thể làm.
Matt

Câu trả lời:


798

Bạn sẽ cần thêm một tham chiếu đến System.Configurationtrong thư mục tài liệu tham khảo của dự án .

Bạn chắc chắn nên sử dụng ConfigurationManagerquá cũ ConfigurationSettings.


Cảm ơn rât nhiều! rất thẳng về phía trước trả lời. Tôi đang xây dựng một ứng dụng console! và câu trả lời này tiết kiệm trong ngày!
PatsonLeaner

1
Điều này vẫn chính xác cho lõi .net.
Triynko

868

Đối với tệp app.config mẫu như dưới đây:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Bạn đọc các cài đặt ứng dụng ở trên bằng mã hiển thị bên dưới:

using System.Configuration;

Bạn cũng có thể cần thêm một tài liệu tham khảo System.Configurationtrong dự án của mình nếu chưa có tài liệu tham khảo . Sau đó, bạn có thể truy cập các giá trị như vậy:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

124
Tôi thích câu trả lời của bạn hơn câu trả lời được chấp nhận. Câu trả lời với các ví dụ luôn luôn làm cho tôi.
Brendan Vogt

Điều này làm việc cho tôi. Tuy nhiên, System.Configuration của tôi không chứa Trình quản lý cấu hình, vì vậy tôi phải sử dụng Cấu hình. Trớ trêu thay, tôi vẫn nhận được một cảnh báo rằng nó đã lỗi thời.
Trò chơi ác mộng

13
Điều này xảy ra với tôi quá. Bạn đã thử thêm tham chiếu System.Configuration chưa? Vấn đề là VS đánh lừa bạn bằng cách khiến bạn nghĩ rằng bạn thực sự có nó; bạn có thể sử dụng intellisense để lấy không gian tên System.Configuration nhưng nó không có lớp Cấu hình. Chỉ cần thêm tài liệu tham khảo và sửa nó.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration có chứa Trình quản lý cấu hình, bạn có thể thiếu một tham chiếu đến System.Configuration trong dự án của bạn.
TreK

2
Ai đó có thể cho tôi biết lý do tại sao họ nghĩ System.Configuration không được thêm vào theo mặc định ... đây có vẻ là một nhu cầu khá cơ bản trong hầu hết các ứng dụng.
Todd Vance

89

Cập nhật cho .NET Framework 4.5 và 4.6; sau đây sẽ không còn hoạt động:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Bây giờ truy cập lớp Cài đặt thông qua Thuộc tính:

string keyvalue = Properties.Settings.Default.keyname;

Xem Quản lý cài đặt ứng dụng để biết thêm thông tin.


1
Tài sản từ năm 2010 .
Nick Westgate

1
Cảm ơn rất nhiều vì đã gửi bài này. Tôi đã xác định rằng Properties.Sinstall.Default.MachName hoạt động, nhưng tôi không thể hiểu tại sao Cấu hình Trình quản lý.AppSinstall ["MachName"] trả về null.
J. Chris Compton

1
Điều này đã kết thúc nỗi đau đớn kéo dài của tôi. Cảm ơn. Khung nên cảnh báo bạn rằng cách cũ đã lỗi thời.
Neil B

7
Không thể xác nhận. Cấu hình Trình quản lý.AppSinstall ["someKey"] hoạt động trong .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Bạn đã sử dụng phiên bản VisualStudio nào? Cấu hình Trình quản lý.AppSinstall ["someKey"] đã hoạt động với 4.6.1 và VS 15.8.2 nhưng không thành công với 4.6.1 và VS 15.9.2 đối với tôi.
kkuilla

37

Nhấp chuột phải vào thư viện lớp của bạn và chọn tùy chọn "Thêm tài liệu tham khảo" từ Menu.

Và từ tab .NET, chọn System.Configuration. Điều này sẽ bao gồm tệp DLL System.Configuration vào dự án của bạn.


Sau khi thêm tài liệu tham khảo, đã có thể làmConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Tôi đang sử dụng cái này và nó hoạt động tốt với tôi:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

48
TS tuyên bố rõ ràng rằng anh ta sử dụng cùng một mã, nhưng dự án của anh ta không biên dịch được (do thiếu tài liệu tham khảo, khi nó bật ra). -1 vì không đọc câu hỏi.
Isantipov

23

Đọc từ cấu hình:

Bạn sẽ cần thêm một tham chiếu đến cấu hình:

  1. Mở "Thuộc tính" trong dự án của bạn
  2. Chuyển đến tab "Cài đặt"
  3. Thêm "Tên" và "Giá trị"
  4. Nhận giá trị bằng cách sử dụng mã sau đây:

    string value = Properties.Settings.Default.keyname;

Lưu vào cấu hình:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();

1
FYI: Google thích câu trả lời của bạn nhất. Hiển thị nguyên văn khi bạn tìm kiếm "cài đặt cấu hình ứng dụng c #"
Steve Gomez

21

Bạn phải thêm một tham chiếu đến cụm System.Configuration cho dự án.


18

Bạn có thể thêm tệp App.config vào tệp DLL. App.Config chỉ hoạt động cho các dự án thực thi, vì tất cả các tệp DLL lấy cấu hình từ tệp cấu hình cho tệp EXE đang được thực thi.

Giả sử bạn có hai dự án trong giải pháp của mình:

  • Một số
  • Một số ngoại lệ

Vấn đề của bạn có thể liên quan đến thực tế là bạn đang bao gồm tệp app.config cho someDLL chứ không phải someExe. Một sốDll có thể đọc cấu hình từ dự án someExe.


Wow, điều đó không rõ ràng. Nếu ai đó có thể liên kết một tài liệu nói về điều này, điều đó thật tuyệt vời. Đây là một chủ đề khó khăn để tìm kiếm trên.
David Krider

Cám ơn vì cái này. Không thấy điều này nêu ở bất cứ đâu.
tham số

10

Thử cái này:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Trong tệp web.config, đây sẽ là cấu trúc tiếp theo:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>

8

Tôi đã từng gặp vấn đề tương tự. Chỉ cần đọc chúng theo cách này: System.Configuration.ConfigurationSinstall.AppSinstall ["MySetting"]


4
Theo Microsoft liên quan đến Cấu hình cài đặt. Cài đặtThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
phương pháp này đã lỗi thời
GabrielBB

7

web.configđược sử dụng với các ứng dụng web. web.configtheo mặc định có một số cấu hình cần thiết cho ứng dụng web. Bạn có thể có một web.configthư mục cho mỗi ứng dụng web của bạn.

app.configđược sử dụng cho các ứng dụng Windows. Khi bạn xây dựng ứng dụng trong Visual Studio, nó sẽ tự động được đổi tên thành <appname>.exe.configvà tệp này phải được gửi cùng với ứng dụng của bạn.

Bạn có thể sử dụng cùng một phương thức để gọi các app settingsgiá trị từ cả hai tệp cấu hình: System.Configuration.ConfigurationSinstall.AppSinstall ["Key"]


Cũng có thể sử dụng System.Configuration.COnfigurationSettings.AppSettings.Get("Key")thay vì sử dụng dấu ngoặc vuông.
Mason

7

Như tôi đã tìm thấy cách tiếp cận tốt nhất để truy cập các biến cài đặt ứng dụng theo cách có hệ thống bằng cách tạo một lớp bao bọc trên System.Configuration như dưới đây

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Bây giờ chúng ta có thể truy cập các biến cài đặt cần thiết bằng các tên được mã hóa cứng bằng cách sử dụng một lớp khác như dưới đây:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}

Điều này sử dụng phương pháp mà OP chỉ ra được đánh dấu là không dùng nữa.
dùng2864740

4

Tôi thực sự khuyên bạn nên tạo một trình bao bọc cho cuộc gọi này. Một cái gì đó giống như ConfigurationReaderServicevà sử dụng tiêm phụ thuộc để có được lớp này. Bằng cách này, bạn sẽ có thể cô lập các tệp cấu hình này cho mục đích thử nghiệm.

Vì vậy, sử dụng ConfigurationManager.AppSettings["something"];đề xuất và trả lại giá trị này. Với phương pháp này, bạn có thể tạo một số loại trả về mặc định nếu không có bất kỳ khóa nào có sẵn trong tệp .config.


3
Microsoft đã có bulit-in cách để quản lý nhiều phiên bản của tập tin cấu hình giống nhau: xây dựng cấu hình , cho phép có tập tin cấu hình riêng cho từng cấu hình build: app.DEBUG.config, app.RELEASE.config, và app.TEST.configvv
jpaugh

4

Ngoài ra, bạn có thể sử dụng Formo :

Cấu hình:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Mã số:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();

5
Tại sao bạn muốn làm điều này?
lukejkw

3

Để hoàn thiện, chỉ có một tùy chọn khác dành cho các dự án web: System.Web.Configuration.WebConfigurationManager.AppSinstall ["MySetting"]

Lợi ích của việc này là nó không yêu cầu thêm tài liệu tham khảo, vì vậy một số người có thể thích hợp hơn.


3

Bước 1: Nhấp chuột phải vào tab tham chiếu để thêm tham chiếu.

Bước 2: Nhấp vào tab Lắp ráp

Bước 3: Tìm kiếm 'System.Configuration'

Bước 4: Nhấn OK.

Sau đó, nó sẽ làm việc.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];

2

Tôi luôn tạo giao diện IConfig với các thuộc tính an toàn được khai báo cho tất cả các giá trị cấu hình. Một lớp thực hiện Cấu hình sau đó kết thúc các cuộc gọi đến System.Configuration. Tất cả các lệnh gọi System.Configuration của bạn hiện đang ở một nơi và việc duy trì và theo dõi các trường nào đang được sử dụng và khai báo các giá trị mặc định của chúng sẽ dễ dàng và sạch sẽ hơn rất nhiều. Tôi viết một tập hợp các phương thức trợ giúp riêng để đọc và phân tích các kiểu dữ liệu phổ biến.

Sử dụng khung IoC, bạn có thể truy cập vào các trường IConfig ở bất kỳ nơi nào trong ứng dụng của bạn bằng cách chuyển giao diện đến hàm tạo của lớp. Sau đó, bạn cũng có thể tạo các triển khai giả của giao diện IConfig trong các thử nghiệm đơn vị của mình để giờ đây bạn có thể kiểm tra các giá trị cấu hình và kết hợp giá trị khác nhau mà không cần phải chạm vào tệp App.config hoặc Web.config.


1

Một giải pháp khả thi khác:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();

1

Tôi đã cố gắng tìm một bản sửa lỗi cho vấn đề tương tự trong vài ngày nay. Tôi đã có thể giải quyết vấn đề này bằng cách thêm một khóa trong thẻ cài đặt ứng dụng trong tệp web.config . Điều này sẽ ghi đè lên tập tin dll khi sử dụng trình trợ giúp.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>

1

Bạn có thể sử dụng dòng dưới đây. Trong trường hợp của tôi, nó đã hoạt động: System.Configuration.ConfigurationSinstall.AppSinstall ["yourKeyName"]

Bạn phải lưu ý rằng dòng mã trên cũng là phiên bản cũ và nó không được dùng trong các thư viện mới.


1

Trình quản lý cấu hình không phải là những gì bạn cần để truy cập các cài đặt của riêng bạn.

Để làm điều này bạn nên sử dụng

{YourAppName}.Properties.Settings.{settingName}


1

Tôi đã có thể có được cách tiếp cận dưới đây làm việc cho các dự án .NET Core:

Các bước:

  1. Tạo một appsinstall.json (định dạng được đưa ra dưới đây) trong dự án của bạn.
  2. Tiếp theo tạo một lớp cấu hình. Các định dạng được cung cấp dưới đây.
  3. Tôi đã tạo một phương thức Đăng nhập () để hiển thị việc sử dụng Lớp Cấu hình.

    Tạo appsinstall.json trong dự án của bạn với nội dung:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

Nếu bạn cần / muốn sử dụng ConfigurationManagerlớp ...

Bạn có thể cần tải System.Configuration.ConfigurationManagerbởi Microsoft thông qua Trình quản lý gói NuGet

Công cụ-> Trình quản lý gói NuGet-> Quản lý gói NuGet cho Giải pháp ...

Tài liệu Microsoft

Một điều đáng chú ý từ các tài liệu ...

Nếu ứng dụng của bạn cần quyền truy cập chỉ đọc vào cấu hình của chính nó, chúng tôi khuyên bạn nên sử dụng phương thức GetSection (Chuỗi). Phương thức này cung cấp quyền truy cập vào các giá trị cấu hình được lưu trong bộ nhớ cache cho ứng dụng hiện tại, có hiệu năng tốt hơn lớp Cấu hình.


0

Vui lòng kiểm tra phiên bản .NET bạn đang làm việc. Nó phải cao hơn 4. Và bạn phải thêm thư viện hệ thống System.Configuration vào ứng dụng của mình.


3
Câu hỏi này đã được hỏi hơn 9 năm trước và đã có hơn 20 câu trả lời, trong đó có 2 câu trả lời, mỗi câu có hơn 600 câu trả lời, câu trả lời được chấp nhận là thêm một tham chiếu đến System.Configuration. Câu trả lời bổ sung này không thêm giá trị. Tốt nhất, đây nên là một nhận xét về câu trả lời được chấp nhận.
Richardissimo

Re "cao hơn 4" : Trong số phiên bản chính? Hay bạn có nghĩa là "cao hơn 4.0" ? Hay nói cách khác, .NET Framework 4.5 sẽ ở phía nào?
Peter Mortensen

-8

Đây là một ví dụ: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
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.