Замена app.config во время выполнения

Вот мой appconfig:

  <connectionStrings>
    <add name ="cn" connectionString="User ID=YOUR_USER_HERE; Password=YOUR_PASS_HERE;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=.)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=.)));"/>
  </connectionStrings>

Я попробовал эту функцию:

public void updateConfigFile(string con)
        {


            //updating config file
            XmlDocument XmlDoc = new XmlDocument();
            //Loading the Config file
            XmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            foreach (XmlElement xElement in XmlDoc.DocumentElement)
            {
                if (xElement.Name == "connectionStrings")
                {
                    {
                        xElement.FirstChild.Attributes[1].Value = con;
                    }
                }
            }
            //writing the connection string in config file
            XmlDoc.Save("App.config");            
        }

Это не сработало. Это бежало без любой ошибки. Но это не сохранило connectionString в файле appconfig. Я также попробовал эту идею:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
connectionStringsSection.ConnectionStrings["Blah"].ConnectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah";
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");

Я получаю сообщение об ошибке UnauthorizedAccess. (Я верю, что это из-за моей школьной сети)

Эти два варианта не сработали до сих пор. Я также пытался установить ConfigurationManager.ConnectionStrings["cn"] на мою пользовательскую строку подключения. Так как это только для чтения, это тоже не удалось. Есть ли другая идея, что я могу заменить connectionString во время выполнения?

Заранее спасибо.

1 ответ

Решение

Изменение файла конфигурации приложения должно быть выполнено до запуска приложения, так как некоторые ключи читаются средой выполнения только тогда, когда ваше приложение загружается, а другие - только для чтения.

Вы можете динамически изменять записи конфигурации AppSettings раздел только путем ссылки на System.Configuration сборка. Все остальные ключи предназначены только для чтения.

Если вы не хотите изменять конфигурацию перед запуском приложения, вам нужно подумать обо всех задействованных объектах: кто будет читать вашу строку подключения? Если это вы, вы можете просто сохранить его где-то еще или даже в AppSettings ключ. Вместо этого, если внешним компонентам требуется прочитать его из файла конфигурации, у вас нет шансов изменить архитектуру вашего приложения, чтобы иметь оболочку, которая вносит изменения перед запуском вашего приложения.

AppSettings ключ может быть изменен таким образом, после System.Configuration сборка (это жизненно важно).

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="key1" value="configuration"/>
    </appSettings>  
</configuration>

Program.cs

using System;
using System.Configuration;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Configuration.ConfigurationManager.AppSettings["key1"] = "changed";

            var value = System.Configuration.ConfigurationManager.AppSettings["key1"];

            Console.WriteLine($"This is the new key: {value}.");
        }
    }
}
Другие вопросы по тегам