2010-02-09 19 views
6

La mia app asp.net ha utilizzato un web.config per la configurazione comune. Ho anche una sezione che mappa alcuni oggetti dati per le stringhe di connessione, e quella sezione sarà di duemila righe. Voglio spostare quella sezione in un altro file di configurazione "dataMappings.config", quindi non ingrosserò web.config - esiste un meccanismo standard per accedere a quel file di configurazione?Lettura impostazioni da file di configurazione separato

Grazie, Andrey

risposta

10

In ogni sezione, è possibile definire configSource, che può puntare a un percorso di file esterno. Ecco un semplice esempio:

<connectionStrings configSource="myConnectionStrings.Config" /> 
<appSettings configSource="myAppSettings.Config" /> 

Basta fare attenzione a non utilizzare .xml estensione del file dal momento che può essere visualizzato in un browser. .config non verrà servito dal server web.

Poiché le sezioni di configurazione sono ancora definite in web.config (indicando in tal modo a file esterni), è possibile accedere a queste informazioni tramite le vie normali (WebConfigurationManager.AppSettings, WebConfigurationManager.GetSection, ConfigurationManager o gestori di sezione personalizzati a seconda delle necessità)

+0

Funzionerà se sto utilizzando una sezione personalizzata? O devo fare qualcosa in quel codice di sezione personalizzato per supportare l'attributo configSource? – Andrey

+0

+1 - Buona risposta, bastonatemi! –

+0

@Andrey: funziona con ** qualsiasi ** 'ConfigurationSection' in .NET 2.0 e up framework. –

1

Ho usato un helper di configurazione in una DLL condivisa e un file app.config nella DLL che utilizza le impostazioni Settings.Properties.Default modificando il progetto e impostando la scheda delle impostazioni. Sembra che il valore non sia letto a meno che non ricompili, e risincronizzi l'app.config (nella dll) con le impostazioni del progetto.

Questo funziona per me. Non ricordo dove ho preso l'ispirazione. Ho solo incluso questa classe in un progetto condiviso da qualche parte. consente a qualsiasi DLL di chiamare le proprie impostazioni, che consente di modificare le voci dllFile.dll.config. Lo uso per le stringhe di connessione. L'avvertenza è che in questo metodo, la stringa di connessione deve essere una stringa di tipo, e non la stringa di connessione speciale.

using System; 
using System.Configuration; 

namespace Shared 
{ 
    public static class ConfigurationHelper 
    { 
     public static string GetConfigValue(string keyName) 
     { 
      string codebase = System.Reflection.Assembly.GetCallingAssembly().CodeBase; 
      Uri p = new Uri(codebase); 
      string localPath = p.LocalPath.ToLowerInvariant(); 
      string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath); 
      string sectionGroupName = "applicationSettings"; 
      string sectionName = executingFilename + ".Properties.Settings"; 
      string configName = localPath + ".config"; 
      ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
      fileMap.ExeConfigFilename = configName; 
      Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
      ConfigurationSectionGroup group = config.GetSectionGroup(sectionGroupName); 
      ClientSettingsSection section = null; 
      foreach (ClientSettingsSection sect in group.Sections) 
      { 
       if (sect.SectionInformation.Name.Equals(sectionName, StringComparison.InvariantCultureIgnoreCase)) 
       { 
        section = sect; 
        break; 
       } 
      } 
      SettingElement elem = section.Settings.Get(keyName); 
      if (elem == null) 
       return ""; 
      else 
       return elem.Value.ValueXml.InnerText.Trim(); 
     } 
    } 
} 

//in DLL 
void foo() 
{ 
    var str = ConfigurationHelper.GetSetting("ConnectionStringProd"); 
} 
Problemi correlati