2008-12-10 3 views
16

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

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

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

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

Благодаря

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

+0

Вы можете переместить строки подключения из web.config. См. Рекомендации по развертыванию паролей и других конфиденциальных данных на сайтах ASP.NET и Azure http://www.asp.net/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive -data-to-aspnet-and-azure – RickAndMSFT 2015-03-17 03:36:23

ответ

9
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

0

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

+0

-1 это совсем не так, это просто заставляет вас перерабатывать ваш сайт. – 2015-03-17 14:28:40

+0

Ohh..come on !! Уверен, что вы можете это xml-файл, но это очень плохая практика. .NET не имеет API для изменения конфигурационных файлов ... спросите себя, почему. "-) – ema 2015-03-18 09:38:40

+0

неверно, у него абсолютно есть API-интерфейсы для изменения конфигурационных файлов` OpenWebConfiguration/Save` http://stackoverflow.com/a/719941/37055 – 2015-03-18 20:21:05

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]; 
     } 
    } 
} 

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

1

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

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

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

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

Если да, то вы можете указать строку соединения «переменные» в конфигурации, но установить их на ложную или пустую связь строки:

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

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

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

1

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

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

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

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

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

20

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

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

Это подобно технике, необходимой для modify an existing connection string, и добавил, как комментарий там Брайана Роджерса.

Смежные вопросы