2013-07-21 7 views
6

Sto cercando di creare una sezione file di configurazione personalizzata basata su AppSettings:Qual è la differenza tra ConfigurationManager.GetSection e Configuration.GetSection?

<configSections> 
    <section name="customConfiguration" 
      type="System.Configuration.AppSettingsSection, 
       System.Configuration, 
       Version=2.0.0.0, Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a"/> 
</configSections> 

quando ho provato a leggerlo tramite ConfigurationManager.GetSection ("customConfiguration") l'oggetto riscontrato è di tipo System.Configuration.KeyValueInternalCollection. Non ero in grado di leggere i valori di questa raccolta, anche se potevo vedere le chiavi e non potevo trasmetterle a AppSettingsSection.

This StackOverflow risposta suggerisce dovrei usare

Configuration config = 
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
AppSettingsSection customSettingSection = 
    (AppSettingsSection)config.GetSection("customConfiguration"); 

Questo ha funzionato. La mia domanda è: qual è la differenza tra ConfigurationManager.GetSection() e Configuration.GetSection()? Quando dovrei usarne uno e quando dovrei usare l'altro?

risposta

5

Secondo la documentazione di MSDN sulla classe di configurazione http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx,

Se le vostre esigenze applicative accesso in sola lettura per la propria configurazione, si consiglia di utilizzare i sovraccarichi GetSection metodo per le applicazioni Web. Per l'applicazione client, utilizzare il metodo GetSection.

Questi metodi forniscono l'accesso ai valori di configurazione memorizzati nella cache per l'applicazione corrente, che ha prestazioni migliori rispetto alla classe Configurazione.

In particolare, nelle applicazioni client, il ConfigurationManager recupera un file di configurazione ottenuto unendo il file di configurazione dell'applicazione, il file di configurazione utente locale e il file di configurazione roaming.

+0

Quindi Configuration.GetSection è per le app client, ottenere la sezione della configurazione utente specificata (per tutti gli utenti, il profilo locale dell'utente corrente o il profilo di roaming dell'utente corrente, in base a ConfigurationUserLevel specificato in OpenExeConfiguration)? E ConfigurationManager.GetSection ottiene la sezione della configurazione predefinita, che per le app client è la combinazione di tutte e tre le configurazioni utente (tutti gli utenti, il profilo locale dell'utente corrente, il profilo di roaming dell'utente corrente)? Perché allora i due metodi GetSection restituiscono tipi di oggetto diversi? –

+1

'System.Configuration.GetSection()' è generico e può essere utilizzato sia per applicazioni web che client, mentre 'ConfigurationManager.GetSection()' è un wrapper ottimizzato specificamente per le app client. – Claies

+0

@Claies significa che non esiste un modo predefinito per usare 'ConfigurationManager.OpenMappedExeConfiguration()' per aprire un file di configurazione diverso e farlo funzionare bene usando il suo '' Configuration.GetSection() ''per caricare una sezione. Poiché solo 'ConfigurationManager.GetSection()' "funziona bene" ma utilizza la configurazione predefinita dell'applicazione – FRoZeN

Problemi correlati