2009-03-20 3 views
1

Возможно ли изменить соединительные строки, определенные в app.config/web.config во время выполнения? Я хочу использовать разные конфигурационные файлы в зависимости от того, на каком оборудовании работает приложение/сайт (конечно, только для целей отладки. Мы будем использовать обычные файлы конфигурации при развертывании).Возможно ли изменить конфигурацию ConnectionStrings во время выполнения?

Я могу написать AppSettings, но не ConnectionStrings (AFAIK). Или я могу?

+0

Повторите свой «за разработчика» - я добавлю дополнительную мысль ... –

ответ

2

Да, это возможно, но AFAIK только через Reflection. Следующий код должен делать то, что вам нужно (читай ниже для использования):

public static string SetConnectionString(Type assemblyMember, 
             Type settingsClass, 
             string newConnectionString, 
             string connectionStringKey) 
{ 
    Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName)); 

    if (typSettings == null) 
    { 
    return null; 
    } 

    PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public); 

    if (prpDefault == null) 
    { 
    return null; 
    } 

    object objSettings = prpDefault.GetValue(null, null); 

    if (objSettings == null) 
    { 
    return null; 
    } 

    // the default property, this[], is actually named Item 
    PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public); 

    if (prpItem == null) 
    { 
    return null; 
    } 

    object[] indexerName = { connectionStringKey }; 
    string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName); 

    prpItem.SetValue(objSettings, newConnectionString, indexerName); 

    return oldConnectionString; 
} 

assemblyMember типа вызова
settingsClass типа вашего класса настроек
newConnectionString является полной строкой для установки
connectionStringKey является имя строки подключения, которую вы определили в настройках вашего приложения.

Вы должны вызвать этот метод как можно скорее после запуска вашего приложения, предпочтительно в методе Main().

+0

Спасибо, я попробую. – Inferis

+1

Это может быть намного проще: http://david.gardiner.net.au/2008/09/programmatically-setting.html http://stackoverflow.com/a/8494274 – user423430

0

Вы не можете редактировать файл конфигурации текущего процесса.

Один из вариантов (с плюсами и минусами) заключается в использовании конфигурационных данных в файле machine.config или master web.config (для «сайта» вы используете узлы «location») - не возможность спешить, хоть.

Лучший способ справиться с этим заключается в замене файла конфигурации как части процесса сборки/развертывания, идеально автоматизированного. Таким образом, все самодостаточно, и вы можете «robocopy» на ванильном сервере и заставить его работать.


Повторите запрос «за разработчика»; Я обнаружил, что самый простой способ сделать это - стандартизировать конфигурацию и настроить машины. Например, мы запускаем локальный веб-сервер на виртуальной машине; вместо кода на каждой машине мы стандартизируем «localserver» (зеркало «localhost») и добавляем локальную запись DNS на каждую машину, которую может контролировать разработчик. Обратите внимание, что для этого требуется фиксированный IP-адрес (или, возможно, резервирование DHCP), чтобы предотвратить его с течением времени!

Ditto базы данных; локальные серверы могут использовать «.»; удаленные серверы могут быть выровнены на машине, поэтому «devserver» указывает на то, что хочет пользователь.

Просто мысли ...

+0

Ну, мы делаем это для тестирования/производства. Я хочу, чтобы иметь возможность переопределять соединительные строки «для каждого разработчика». – Inferis

1

Я попробовал один раз в моем проекте для отладки цели, но не мог сделать это, проблема (я думаю, поправьте меня, если я ошибаюсь) на приложение запускается приложение .config загружается в память, любые изменения в app.config во время работы приложения не отражаются.

Чтобы преодолеть это, вот что я сделал, определите все соединительные строки в app.config, а затем вызовите те, которые вы хотите, когда ваша программа работает так.

, например, позволяет предположить, что вы определили свои соединительные строки в app.config следующим образом.

<connectionStrings> 
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1" 
     connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data 
     Source=|DataDirectory|\file.mdb" 
     providerName="System.Data.OleDb"/> 

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2" 
     connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data 
     Source=|DataDirectory|\file.mdb" 
     providerName="System.Data.OleDb"/> 

</connectionStrings> 

определить столько, сколько вы хотите (вы отладки правильно :-)) затем вызвать эти настройки соединения в вашем коде сделать что-то вроде этого:

YourNameSpace.Properties.Settings Foo = новый YourNameSapce .Properties.Settings();

foo.ConnectionString_1;

HTH

С наилучшими пожеланиями

@nand

P.S: Этот ответ является специфичным для C#.

0

Эта статья входит в подробности о параметрах, которые есть: http://aspalliance.com/820

+0

Что не приносит ничего нового. Я сказал, что могу изменить AppSettings, но это связующие строки, дающие мне головные боли. – Inferis

0

Вы можете запустить xmlpoke в сценарий NAnt при установке веб-сайта.

E.g.

  1. Разверните NAnt с помощью веб-сайта.
  2. Создайте go.bat, который вызывает NAnt, который устанавливает сайт и выполняет xmlpoke, чтобы изменить файл web.config с настройками на основе имени сервера или другого параметра.
Смежные вопросы