Есть ли способ, где я могу добавить строку подключения в ConnectionStringCollection, возвращаемую ConfigurationManager во время выполнения в приложении Asp.Net?
Я пробовал следующее, но мне сказали, что файл конфигурации только для чтения.
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));
Есть ли другой способ сделать это во время выполнения? Я знаю, что во время разработки я могу добавить строку подключения в web.config; Тем не менее, я хочу добавить что-то в эту коллекцию во время выполнения.
Спасибо
РЕДАКТИРОВАТЬ: Одна из причин, почему я пытаюсь сделать это из-за требования безопасности, которое не позволяет мне разместить ConnectionStrings в web.config (даже в зашифрованном виде). Я хотел бы использовать такие элементы, как членство и профили в моем проекте; Тем не менее, я ищу альтернативу делать без написания пользовательских провайдера. Таможенные провайдеры не так уж и плохи, но если я могу найти более простое решение, я полностью за это.
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
Нет, вы не можете изменить файл конфигурации во время выполнения, он не предназначен для этого. Может быть, вы могли бы использовать конфигурацию корпоративных библиотек для этого.
OpenWebConfiguration/Save
stackoverflow.com/a/719941/37055OpenWebConfiguration
, по иронии судьбы, я не прокручивал, прежде чем связываться с другим вопросом. Я, конечно, согласен с вами, что все не должны этого делать, но не могут быть абсолютными. Абсолюты почти всегда неправы в любой ситуации в программном обеспечении ... если только это не связано с Oracle, но я отвлексяЕсли вы пытаетесь редактировать строки подключения в вашем файле 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];
}
}
}
Или вы всегда можете пойти немного тяжелее и использовать что-то вроде блока конфигурации корпоративной библиотеки.
Еще не пробовали, но, возможно, вы можете изменить значение существующей строки соединения во время выполнения? Например, вместо:
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));
Может быть, вы могли бы сделать что-то вроде:
ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";
Если это так, вы можете указать строку подключения «переменные» в конфигурации, но установить для них значение false или пустые строки подключения:
<add name="myconnection" connectionString="SET AT RUNTIME" ... />
Просто указать на того, кто дал вам «требование безопасности», что вы не можете поместить строку подключения в web.config, - идиот. К web.config никогда нельзя получить доступ, кроме вашего приложения или удаленного доступа к серверу.
Это звучит как проблема требований и должно быть решено там.
Инфраструктура конфигурации поддерживает очень надежное шифрование с помощью Windows DataProtection API, который использует машинный ключ для шифрования разделов конфигурации. Таким образом, было бы невозможно прочитать зашифрованные данные нигде, кроме как на машине, где они были зашифрованы.
Это тот же API, который используется для правительственного шифрования диска / папки в Windows. Будет ли это соответствовать требованиям безопасности вашей компании?
Либо вручную, либо с помощью автоматизации развертывания вы можете выполнить эту команду для шифрования раздела connectionStrings вашего web.config для определенного веб-приложения.
aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"
Если вы используете MS SQL, вы можете настроить свой веб-сервер для доступа к SQL-серверу через проверку подлинности Windows, поэтому вам никогда не придется вообще вводить какие-либо пароли в веб-конфигурации или даже перемещаться в памяти приложения.
Вы можете использовать отражение, чтобы отключить приватное поле bReadOnly (плохая идея и т. Д.):
typeof(ConfigurationElementCollection)
.GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());
Это похоже на технику, необходимую для изменения существующей строки соединения , и добавлено в качестве комментария Брайаном Роджерсом.