web-dev-qa-db-fra.com

Comment mettre à jour appsettings.json en fonction du profil de publication à l'aide de .NET Core?

Je passe actuellement de .NET Framework à .NET Core. Dans le passé, tous mes paramètres d'application se trouvaient dans le fichier Web.config. Lorsque j'ai ajouté un nouveau profil de publication, je pouvais cliquer avec le bouton droit de la souris et sélectionner "Ajouter une transformation de configuration" qui générerait un fichier Web imbriqué. {Profil} .config sous Web.config où je pourrais définir les paramètres d'application spécifiques au profil respectif.

Maintenant, dans .NET Core, je veux obtenir le même effet en utilisant un fichier appsettings.json au lieu du fichier Web.config. Comment puis-je créer un fichier appsettings. {Profile} .json qui sera imbriqué sous mon fichier appsettings.json et contenant des paramètres spécifiques à mon profil de publication? Bien sûr, je peux créer le fichier manuellement, mais qu'est-ce qui "relie" les paramètres afin qu'ils remplacent appsettings.json lors de la publication de l'application? Existe-t-il un moyen simple de le faire dans Visual Studio comme je l'ai décrit pour mes anciens projets .NET Framework? Ou est-ce que je manque quelque chose?

Merci!

7
Matthew

mais qu'est-ce qui "relie" les paramètres afin qu'ils remplacent appsettings.json lors de la publication de l'application?

Les paramètres d'application sont configurés par WebHost dans Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

Dans l'implémentation de webhost.cs le framework ajoute les paramètres d'application à l'hébergeur:

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

La deuxième ligne est l'endroit où il ajoute le appsettings spécifique à l'environnement. Dans Visual Studio, cette variable d'environnement est définie dans le Project Settings -> Debug page et s'appelle ASPNETCORE_ENVIRONMENT. Par défaut, il est défini sur Development donc lorsque vous créez et exécutez dans Visual Studio le appsettings.development.json le fichier (s'il existe) sera chargé et remplacera tous les paramètres correspondants dans le appsettings.json fichier.

Lorsque vous publiez votre application, vous pouvez remplacer cette valeur à l'aide d'une variable d'environnement OS du même nom. Il existe une hiérarchie d'où .NET Core lit les valeurs et a une stratégie "le dernier gagne".

La hiérarchie est actuellement:

  1. Fichiers (appsettings.json, appsettings. {Environment} .json, où {Environment} est l'environnement d'hébergement actuel de l'application)
  2. Azure Key Vault
  3. Secrets utilisateur (Secret Manager) (dans l'environnement de développement uniquement)
  4. Variables d'environnement
  5. Arguments de ligne de commande

Ainsi, lorsque vous publiez votre application, vous pouvez remplacer l'environnement sur le système d'exploitation hôte à l'aide d'une variable d'environnement. Lorsque .NET Core démarre votre application publiée, il lit ces variables et charge le fichier appsettings. {Environment} .json approprié. SI la valeur n'est pas définie ou qu'aucun fichier n'existe pour cet environnement, les paramètres dans appsettings.json s'appliquera.

Vous pouvez en savoir plus sur le ASPNETCORE_ENVIROMENT paramètre ici

5
Simply Ged

... et depuis mon commentaire d'origine, j'ai découvert depuis que les transformations web.config sont entièrement prises en charge par VS 2017 et MS Build pour .NET Core, une fois que vous vous rendez compte que les commandes d'imbrication et de transformation ne nécessitent pas de faire partie de le projet plus longtemps. N'utilisez plus la commande "Ajouter des transformations de configuration" sur votre web.config plus longtemps, à moins que vous ne trouviez un correctif qui ne corrompe pas votre fichier de projet. Ajoutez simplement manuellement des versions de transformation de votre web.config, et elles s'emboîteront et s'exécuteront automatiquement lors de la publication. Oui VS 2017!

Ce qui suit, dans votre web.Release.config fonctionne très bien pour définir votre variable d'environnement.

<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <aspNetCore>
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

De plus, avec .NET Core 2.2, vous n'avez plus besoin d'ajouter les transformations de paramètres d'application supplémentaires (désactivation de votre variable d'environnement) à votre classe de démarrage. Cette valeur par défaut ...

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

... s'occupe automatiquement du code de réponse accepté.

En fin de compte, en tant que développeur Microsoft sans excuse, je veux toujours supposer que mon application ne sera publiée que sur un serveur IIS, utilisant MS Build et Web Deploy, et j'aimerais pouvoir pour configurer mon application via sa propre configuration, et je veux pouvoir le faire sur Build, pas en tant que commande de ligne de commande de publication ou de post-publication. Si Microsoft ou quelqu'un crée un plugin de build simple pour Visual Studio qui se transformera mon fichier appsettings.json, donc je ne publie que ce qui est nécessaire pour l'environnement donné, je serai heureux de l'utiliser, mais je n'en ai pas trouvé un, ou je n'ai pas encore eu le temps d'en écrire un.

Et juste pour m'assurer de répondre directement à la question de l'OP: AppSettings peut facilement être transféré de web.config vers appsettings.json, et devrait probablement, tant que vous comprenez TOUS les fichiers appsettings.json sont publiés et déterminés lors de l'exécution -temps, contrairement à une véritable solution de transformation où seuls les fichiers et paramètres nécessaires sont publiés, en fonction du profil demandé. Utiliser la transformation web.config uniquement pour définir la variable d'environnement nécessaire pour déterminer le fichier appsettings. {Env} .json à utiliser. Encore une fois, toute cette discussion va dans le sens du Dodo, si nous pouvons transformer notre fichier apsettings.json de la même manière que notre web.config, comme l'OP l'a demandé. J'ai le sentiment que cela viendra un jour, si ce n'est pas déjà fait.

Oui, le passage d'un ancien .NET Framework à .NET Core peut être un exercice amusant. .NET Core est un énorme pas en avant, mais il y a quelques obstacles à surmonter; surtout pour ceux qui ont été en héritage depuis le début.

4
iGanja