Подтвердить что ты не робот

Могу ли я добавить ConnectionStrings в ConnectionStringCollection во время выполнения?

Можно ли добавить строку соединения в ConnectionStringCollection, возвращаемую ConfigurationManager во время выполнения в приложении Asp.Net?

Я пробовал следующее, но мне сказали, что файл конфигурации доступен только для чтения.

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

Есть ли другой способ сделать это во время выполнения? Я знаю, во время разработки я могу добавить строку подключения в web.config; однако я хочу добавить что-то в эту коллекцию во время выполнения.

Спасибо

EDIT: Одна из причин, почему я пытаюсь это сделать, - это требование безопасности, которое мешает мне устанавливать ConnectionStrings в web.config(даже зашифрованном). Я хотел бы использовать такие элементы, как "Членство и профили" в моем проекте; тем не менее, я рассматриваю альтернативу тому, чтобы делать это без написания пользовательского поставщика. Пользовательский провайдер не так уж плох, но если я смогу найти более легкое решение, я все за него.

4b9b3361

Ответ 1

var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));

cfg.Save();

Будьте уверены, это приведет к тому, что ваш веб-сайт будет переработан, так как он изменяет файл конфигурации. Проверьте http://msdn.microsoft.com/en-us/library/4c2kcht0 (VS.80).aspx

Ответ 2

Вы можете использовать отражение, чтобы отключить личное поле bReadOnly (плохая идея и т.д.):

typeof(ConfigurationElementCollection)
    .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());

Это похоже на технику, требуемую изменить существующую строку подключения и добавленную в качестве комментария там Брайан Роджерс.

Ответ 3

Просто чтобы указать, кто дал вам "требование безопасности", что вы не можете поместить строку соединения в web.config, это идиот. Web.config никогда не может быть доступен ничем, кроме вашего приложения или удаленного доступа к серверу.

Это звучит полностью как проблема требований, и его необходимо решить.

Ответ 4

Если вы пытаетесь отредактировать строки подключения в своем web.config во время выполнения, посмотрите WebConfigurationManager.

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

Я бы рекомендовал создать простой класс фасада, который можно использовать для извлечения строк подключения. Таким образом, вы можете заставить фасад вернуть строку соединения из вашей коллекции на лету или если ее не существует, то она может захватить ее из ConfigurationManager.

class ConnectionStringProvider
{
    Dictionary<string, System.Configuration.ConnectionStringSettings> _localStrings = new Dictionary<string, System.Configuration.ConnectionStringSettings>();

    public void AddLocalConnectionString(string name, string connstring)
    {
        System.Configuration.ConnectionStringSettings cs = new System.Configuration.ConnectionStringSettings(name, connstring);
        _localStrings.Add(name, cs);
    }

    public void RemoveLocalConnectionString(string name)
    {
        _localStrings.Remove(name);
    }

    public System.Configuration.ConnectionStringSettings this[string name] {
        get 
        { 
            return _localStrings.ContainsKey(name) ? _localStrings[name] : System.Configuration.ConfigurationManager.ConnectionStrings[name]; 
        }
    }
}

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

Ответ 5

Еще не пробовал, но, возможно, вы можете изменить значение существующей строки подключения во время выполнения? Например, вместо:

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

Возможно, вы могли бы сделать что-то вроде:

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";

Если это так, вы можете указать строку подключения "переменные" в config, но установите для них значения false или empty строк подключения:

<add name="myconnection" connectionString="SET AT RUNTIME" ... />

Ответ 6

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

Это тот же API, который используется для шифрования диска/папки, совместимого с правительством, в Windows. Будет ли это соответствовать требованиям безопасности вашей компании?

Либо вручную, либо через автоматизацию развертывания вы можете выполнить эту команду для шифрования раздела connectionStrings вашего web.config для определенного веб-приложения.

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"

Ответ 7

Если вы используете MS SQL, вы можете настроить ваш веб-сервер для доступа к SQL Server с помощью проверки подлинности Windows, поэтому вам никогда не придется иметь никаких паролей вообще в вашем webconfig или даже плавать в вашей памяти приложений.

Ответ 8

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