общие строки подключения web.config для разных веб-приложений?

У нас есть несколько веб-приложений, и мы развертываем все веб-приложения в одной папке с именем iapps. Но у каждого приложения есть свой собственный файл web.config, и большинство из них должны иметь общие строки подключения.

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

Текущий

\iapps\app1
         |- web.config

\iapps\app2
         |- web.config

\iapps\app3
         |- web.config

Ожидая

\iapps\app1    --Web.cofig
    |-root Config <-|
\iapps\app2    --Web.cofig
    |-root Config  <-|   
\iapps\app3    --Web.cofig
    |-root Config  <-|     

person James123    schedule 22.09.2014    source источник
comment
что не так с использованием одного файла конфигурации и добавлением нескольких узлов подключения ..? это вполне возможно .. мы делаем это ежедневно .. Я думаю, что лично мне сложнее поддерживать 3 отдельных файла .config, но я думаю, что все возможно.   -  person MethodMan    schedule 22.09.2014
comment
Вы можете поместить строки подключения в machine.config   -  person DavidG    schedule 22.09.2014
comment
установить имена для каждого приложения. ‹connectionStrings› ‹добавить имя=приложение1 connectionString=...   -  person ibram    schedule 22.09.2014
comment
Они находятся под одним решением или несколькими решениями?   -  person Mrchief    schedule 22.09.2014
comment
несколько решений. Есть ли способ прочитать xml из файла web.config?   -  person James123    schedule 22.09.2014
comment
Если это несколько решений, я бы предложил НЕ иметь общий файл конфигурации. Минусы перевешивают плюсы. Добавление их в machine.config, вероятно, сработает, но мне почему-то это не нравится. Если все приложения используют одну и ту же корневую папку, вы можете определить строку подключения в корневом файле web.config. Таким образом, дочерние приложения будут происходить из корня и будут видеть их автоматически. Затем вы должны убедиться, что файл web.config дочернего приложения не содержит этих строк подключения.   -  person Mrchief    schedule 22.09.2014


Ответы (2)


Этот ответ уже описывает несколько альтернатив. Кроме того, вы также можете использовать идею наследования, поместив все общие строки подключения в web.config под корнем (т. е. в данном случае iApps).

app1...appN все наследуют настройки от iapps\web.config

Просто будьте осторожны, чтобы все, что вы определяете в iapps\web.config, не было переопределено в web.config дочерних приложений, иначе вы получите ошибку определения дублирующего раздела в ваших дочерних приложениях.

person Mrchief    schedule 22.09.2014

Вы можете переопределить конфигурацию в вашем объекте AppDomain.

Ваш web.config может выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="WebApp1" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="WebApp2" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<WebApp1>
   <add key="Key1" value="App1 value"/>
</WebApp1>
<WebApp2>
   <add key="Key1" value="App2 value"/>
</WebApp2>
</configuration>

И в вашем событии PageLoad вы можете использовать это:

SetConfig();
var webApp1Config = ConfigurationManager.GetSection("WebApp1") as NameValueCollection;
var webApp2Config = ConfigurationManager.GetSection("WebApp2") as NameValueCollection;

private static void SetConfig()
{
    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Temp\web.config");
    var fieldInfo = typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static);
    if (fieldInfo != null)
        fieldInfo.SetValue(null, 0);
    var field = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static);
    if (field != null)
        field.SetValue(null, null);
    var info = typeof(ConfigurationManager).Assembly.GetTypes().First(x => x.FullName == "System.Configuration.ClientConfigPaths").GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static);
    if (info != null)
        info.SetValue(null, null);
}

Теперь вы можете прочитать свои настройки из настроек конфигурации:

var key1Value = webApp1Config["Key1"];

Ура Мартин

person Martin E    schedule 22.09.2014