web-dev-qa-db-fra.com

Accéder aux paramètres Web.config dans Asp.Net Core App?

Je comprends que le noyau asp.net a un nouveau système de configuration assez flexible et qu’il est génial. Mais il y a des choses que j'aime dans le système de configuration basé sur web.config à partir de .net 4.x. Par exemple, on peut mettre des commentaires dans le fichier web.config puisqu'il s'agit d'un fichier xml. Et pour moi, cela vaut la peine de rester avec xml plutôt que d’avoir recours à la nouvelle approche json brillante. [Mise à jour: Je comprends maintenant que l'approche json prend également en charge les commentaires dans le fichier.]

Donc, si j’ai un projet Web central Asp.Net qui cible l’ensemble de la structure, il me semble que je devrais pouvoir utiliser le fichier basé sur web.config System.Configuration.ConfigurationManager.AppSettings[key] approche pour obtenir un paramètre.

Mais lorsque j'essaie, la valeur revient toujours à null (au moins avec IIS express à l'aide de VS2015).

Cela devrait fonctionner correctement? Des pensées sur ce que je pourrais être trop regarder?

Web.config

<configuration>
    <appSettings>
        <add key="SomeSetting" value="true"/>
    </appSettings>

    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>

        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
     </system.webServer>
</configuration>

Code pour accéder au paramètre:

string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");

MISE À JOUR
Après davantage de recherches, je comprends maintenant pourquoi cela ne fonctionne pas, mais je n'ai toujours pas trouvé le moyen de le réparer. La cause principale semble être que le ConfigurationManager recherche les informations de configuration dans un fichier différent et non dans le fichier web.config.

Ceci peut être vu en regardant AppDomain.CurrentDomain.SetupInformation.ConfigurationFile propriété. Dans mon cas, au lieu de montrer le website_folder\web.config il pointe plutôt sur website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Config où website_folder est le chemin du dossier contenant mon site Web.

La documentation et intellisense disent AppDomain.CurrentDomain.SetupInformation.ConfigurationFile est une propriété réglable mais lorsque j'essaie, je trouve que ce paramètre ne change pas sa valeur. Très étrange.

Donc, alors que je vois maintenant quel est le problème, je n'arrive pas à trouver un moyen de le résoudre.

33
Ron C

J'ai un peu trouvé la solution. La clé pour le comprendre était de réaliser que la propriété AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Ne pointait pas vers le fichier web.config mais plutôt vers le fichier exe.config de l'exécutable exécutant le site Web. N'oubliez pas que, sous .net core, le site Web fonctionne selon son propre processus et possède son propre fichier exe.

Le modèle de configuration utilisé par .Net 4.x avec le ConfigurationManager ressemble donc davantage à celui d’une application de bureau qu’à une application Web 4.x. J'entends par là qu'il s'agit du fichier exe.config et non du site web.config.

Ensuite, j'ai remarqué que le projet Web Asp.Net Core (utilisant l'intégralité de la structure) contient un fichier app.config, à la manière d'une application de bureau. Et il s'avère que si vous mettez vos paramètres de configuration d'application .net 4.x dans ce fichier, ils seront placés dans le fichier exe.config lors de la génération de l'exécutable, que ce soit pour le débogage ou la publication. Exactement comme cela fonctionne avec une application de formes gagnantes par exemple.

Pour utiliser le ConfigurationManager dans une application Web principale asp.net qui cible l'ensemble de l'infrastructure, vous devez donc placer le paramètre d'application dans le fichier app.config plutôt que dans le fichier web.config. Le ConfigurationManager ne les trouvera pas un problème.

enter image description here

Bien que cela explique beaucoup de choses, cela ne permet toujours pas de mettre ces paramètres dans le fichier web.config et d'y accéder via le ConfigurationManager. Mais je commence à croire que ce n'est pas possible dans une application Web principale asp.net, même si elle vise le cadre complet.

36
Ron C

J'ai aussi rencontré ce problème. Après quelques recherches et lectures, vous pouvez ajouter web.config manuellement, mais c’est pour fournir les paramètres de IIS (par exemple, Authentication, ...).

Pour les paramètres d'applications ou les paramètres personnalisés, vous devez utiliser le fichier appsettings.json et la nouvelle configuration dans .Net Core.

Documentation Microsoft

3
jawa

J'ai rencontré ce problème lorsque j'ai commencé à publier mon application asp.net core 1.1 sur IIS.
Il y aurait un fichier web.config généré sur le IIS qui était surchargé lors de la publication. Pour activer l'authentification Windows, je devais ajouter manuellement un web.config) = à mon projet. Celui-ci est publié correctement dans IIS:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\yourproject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>
3
Yush0