Les différences de comportement entre les System.Web.Configuration.WebConfigurationManager et System.Configuration.ConfigurationManager

StackOverflow https://stackoverflow.com/questions/2060993

Question

J'ai eu quelques problèmes sur un serveur de test avec un site Web ASP.NET. Je gaffé, et a la maison répertoire du site Web par défaut a au mauvais endroit. Quand j'ai essayé:

ConfigurationManager.ConnectionStrings["connectionString"]; 

il est revenu nul, mais

using System.Web.Configuration;

/* ... */

var rootWebConfig =
    WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

rootWebConfig.ConnectionStrings.ConnectionStrings["connectionString"].ConnectionString;` 

retourné la chaîne de connexion correcte.

Quelles sont toutes les différences entre les deux approches?

EDIT: Ce que je demande vraiment, pourquoi ne l'approche ConfigurationManager échouent lorsque le répertoire est mal réglé, mais réussit autrement, et le WebConfigurationManager réussit indépendamment du fait que le répertoire est correctement réglé? Y a-t-il d'autres différences, comme les hypothèses sur le contrôle d'accès?

Était-ce utile?

La solution

Essayez ceci:

Mettez un point d'arrêt où votre déclaration de ConfigurationManager est et exécutez la commande suivante dans la fenêtre de sortie immédiate     ((ConfigurationSection) ConfigurationManager.GetSection("connectionStrings")).ElementInformation . Mes rapports de la machine Source: "C: \ Users \ John \ Documents \ Visual Studio 2008 \ Projects \ StackOverflowCode \ WebApplication1 \ web.config" comme on le voit ci-dessous.

Remarque:. Ce qui suit montre aussi le mien accède à la web.config ASP.NET

{System.Configuration.ElementInformation}
    Errors: {System.Configuration.ConfigurationException[0]}
    IsCollection: true
    IsLocked: false
    IsPresent: true
    LineNumber: 17
    Properties: {System.Configuration.PropertyInformationCollection}
    Source: "C:\\Users\\John\\Documents\\Visual Studio 2008\\Projects\\StackOverflowCode\\WebApplication1\\web.config"
    Type: {Name = "ConnectionStringsSection" FullName = "System.Configuration.ConnectionStringsSection"}
    Validator: {System.Configuration.DefaultValidator}

Et quand je lance ConfigurationManager.ConnectionStrings.ElementInformation je reçois Source :. Null qui est correct pour mon application web

Qu'est-ce que vous obtenez pour un chemin de source de configuration ???


immédiate Assomption

ConfigurationManager.ConnectionStrings["connectionString"]; pourrait chercher un emplacement de configuration qui ne sont pas nécessairement les mêmes que web.config racine de l'application Web. Probablement qu'il cherche dans un répertoire Windows (par exemple à un endroit différent ou pour machine.config). Essayer de trouver un test approprié pour ce bien.


Les intentions de chaque gérant

System.Configuration. ConfigurationManager peut accéder au format XML de configuration .NET qui signifie qu'il lit à la fois:

  • configurations Web (par exemple fichier web.config dans ASP.NET)
  • et les configurations non-Web (par exemple fichier app.config - app console autonome, app de Windows, etc.)

et exprime les aspects qui sont communs aux types de configuration. Ceci est un gestionnaire de configuration d'usage général. (Cependant, malgré cette capacité à regarder les deux types de configs, vous devez l'utiliser pour configs application, car le gestionnaire Web est consacré aux configs Web, comme décrit plus loin ...)

System.Web.Configuration . WebConfigurationManager fait à peu près la même chose, mais est la version "webified" du gestionnaire de configuration, l'accès à ASP.NET aspects spécifiques Web de configuration (par exemple fichier web.config en ASP .NET).

Similitudes

Voir les similitudes entre membres ConfigurationManager. * et WebConfigurationManager. *

Les gestionnaires peuvent, par exemple, accéder à une propriété AppSettings et une propriété ConnectionStrings. En effet, ces deux paramètres sont communs aux deux types de configuration et sont même situés au même niveau dans le document XML.

Alors il y a beaucoup de similitudes cependant,

Les différences de comportement

Configuration Accès : ConfigurationManager a des méthodes pour ouvrir configs d'applications autonomes (à savoir App.config de MyProgram.exe) de par rapport à l'application EXEC, alors que WebConfigurationManager a des méthodes pour ouvrir la configuration Web ASP.NET par rapport à son application web répertoire racine dans le site Web.

Voici une base app.config (par exemple ouvert via "C: \ WinApp \ app.config" à partir d'un dossier de disques par ConfigurationManager )

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings/>
  <connectionStrings/>
</configuration>

Et voici une base web.config (par exemple ouvert via "~" qui signifie racine du site Web par WebConfigurationManager )

<?xml version="1.0"?>
<configuration>  
    <appSettings/>
    <connectionStrings/>

    <system.web>
        <!-- special web settings -->
    </system.web>

</configuration>

Remarquez les similitudes. Notez également la configuration de la bande comporte un élément de system.web supplémentaire pour ASP.NET.

Ces gestionnaires sont situés dans différents ensembles .

  • ConfigurationManager: System.Configuration.dll
  • WebConfigurationManager: System.Web.dll

Autres conseils

Première classe permet d'accéder aux fichiers de configuration client généraux (comme app.config) et deuxième pour les fichiers de l'application Web (par exemple web.config).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top