Événement
Championnats du monde Power BI DataViz
14 févr., 16 h - 31 mars, 16 h
Avec 4 chances d’entrer, vous pourriez gagner un package de conférence et le rendre à la Live Grand Finale à Las Vegas
En savoir plusCe navigateur n’est plus pris en charge.
Effectuez une mise à niveau vers Microsoft Edge pour tirer parti des dernières fonctionnalités, des mises à jour de sécurité et du support technique.
Par Rick Anderson et Kirk Larkin
Note
Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 9 de cet article.
Avertissement
Cette version d’ASP.NET Core n’est plus prise en charge. Pour plus d’informations, consultez la stratégie de support .NET et .NET Core. Pour la version actuelle, consultez la version .NET 9 de cet article.
Important
Ces informations portent sur la préversion du produit, qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.
Pour la version actuelle, consultez la version .NET 9 de cet article.
La configuration de l’application dans ASP.NET Core est effectuée à l’aide d’un ou de plusieurs fournisseurs de configuration. Les fournisseurs de configuration lisent les données de configuration de paires clé-valeur à l’aide de diverses sources de configuration :
appsettings.json
Cet article fournit des informations sur la configuration dans ASP.NET Core. Pour plus d’informations sur l’utilisation de la configuration dans des applications de console, consultez Configuration .NET.
Pour obtenir des instructions de configuration Blazor, en complément ou en remplacement des instructions de ce nœud, consultez Configuration Blazor ASP.NET Core.
Les applications ASP.NET Core configurent et lancent un hôte. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. Les modèles ASP.NET Core créent un WebApplicationBuilder qui contient l’hôte. Une configuration peut être effectuée à la fois dans les fournisseurs de configuration de l’hôte et de l’application. Toutefois, seule la configuration nécessaire à l’hôte doit généralement être effectuée dans la configuration de l’hôte.
La configuration de l’application représente la priorité la plus élevée. Elle est détaillée dans la section suivante. La configuration de l’hôte suit la configuration de l’application. Elle est décrite dans cet article.
Les applications web ASP.NET Core créées avec dotnet new ou Visual Studio génèrent le code suivant :
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialise une nouvelle instance de la classe WebApplicationBuilder avec les valeurs par défaut préconfigurées. Le WebApplicationBuilder
(builder
) initialisé fournit la configuration de l’application par défaut dans l’ordre suivant, de la priorité la plus élevée à la plus basse :
Development
appsettings.{Environment}.json
avec le fournisseur de configuration JSON. Par exemple : appsettings.Production.json
et appsettings.Development.json
.La liste suivante contient les sources de configuration de l’hôte par défaut de la priorité la plus élevée à la plus basse pour WebApplicationBuilder :
DOTNET_
avec le fournisseur de configuration des variables d’environnement.ASPNETCORE_
avec le fournisseur de configuration des variables d’environnement.Pour l’hôte générique .NET et l’hôte web, les sources de configuration de l’hôte par défaut de la priorité la plus élevée à la priorité la plus basse sont les suivantes :
ASPNETCORE_
avec le fournisseur de configuration des variables d’environnement.DOTNET_
avec le fournisseur de configuration des variables d’environnement.Quand une valeur de configuration est définie dans la configuration de l’hôte et de l’application, la configuration de l’application est utilisée.
Les variables suivantes sont verrouillées au début lors de l’initialisation des générateurs d’hôtes. Elles ne peuvent pas être affectées via la configuration de l’application :
Development
, Production
et Staging
Tous les autres paramètres d’hôte sont lus à partir de la configuration de l’application et non de la configuration de l’hôte.
URLS
est l’un des nombreux paramètres courants de l’hôte qui n’est pas un paramètre d’amorçage. Comme tous les autres paramètres d’hôte ne figurant pas dans la liste précédente, URLS
est lu ultérieurement à partir de la configuration de l’application. La configuration de l’hôte est une solution de secours pour la configuration de l’application. La configuration de l’hôte peut donc être utilisée pour définir URLS
, mais elle sera remplacée par toute source de configuration dans la configuration de l’application, comme appsettings.json
.
Pour plus d’informations, consultez Modifier la racine du contenu, le nom de l’application et l’environnement et Modifier la racine du contenu, le nom de l’application et l’environnement à l’aide de variables d’environnement ou de la ligne de commande
Les sections suivantes de cet article font référence à la configuration de l’application.
Le code suivant affiche les fournisseurs de configuration activés dans l’ordre dans lequel ils ont été ajoutés :
public class Index2Model : PageModel
{
private IConfigurationRoot ConfigRoot;
public Index2Model(IConfiguration configRoot)
{
ConfigRoot = (IConfigurationRoot)configRoot;
}
public ContentResult OnGet()
{
string str = "";
foreach (var provider in ConfigRoot.Providers.ToList())
{
str += provider.ToString() + "\n";
}
return Content(str);
}
}
La liste des sources de configuration par défaut classées de la priorité la plus élevée à la plus basse précédente affiche les fournisseurs dans l’ordre inverse de leur ajout à l’application générée par le modèle. Par exemple, le fournisseur de configuration JSON est ajouté avant le fournisseur de configuration de ligne de commande.
Les fournisseurs de configuration ajoutés ultérieurement ont une priorité plus élevée. Ils remplacent les paramètres de clé précédents. Par exemple, si MyKey
est défini dans appsettings.json
et dans l’environnement, la valeur d’environnement est utilisée. À l’aide des fournisseurs de configuration par défaut, le fournisseur de configuration de ligne de commande remplace les valeurs de tous les autres fournisseurs.
Pour plus d’informations sur CreateBuilder
, consultez Paramètres du générateur par défaut.
Examinons le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Le JsonConfigurationProvider par défaut charge la configuration dans l’ordre suivant :
appsettings.json
appsettings.{Environment}.json
: par exemple les fichiers appsettings.Production.json
et appsettings.Development.json
. La version de l’environnement du fichier est chargée en fonction de IHostingEnvironment.EnvironmentName. Pour plus d’informations, consultez Utiliser plusieurs environnements dans ASP.NET Core.Les valeurs appsettings.{Environment}.json
remplacent les clés dans appsettings.json
. Par exemple, par défaut :
appsettings.Development.json
remplace les valeurs trouvées dans appsettings.json
.appsettings.Production.json
remplace les valeurs trouvées dans appsettings.json
. Par exemple, lors du déploiement de l’application sur Azure.Si une valeur de configuration doit être garantie, consultez GetValue. L’exemple précédent lit uniquement les chaînes. Il ne prend pas en charge de valeur par défaut.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
Les commentaires dans les fichiers appsettings.json
et appsettings.{Environment}.json
sont pris en charge à l’aide des commentaires de style JavaScript ou C#.
La meilleure méthode pour lire les valeurs de configuration associées consiste à utiliser le modèle d’options. Par exemple, pour lire les valeurs de configuration suivantes :
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Créez la classe PositionOptions
suivante :
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Classe d’options :
Position
n’est pas lié. Le champ Position
est utilisé pour qu’il ne soit pas nécessaire de coder la chaîne "Position"
en dur dans l’application lors de la liaison de la classe à un fournisseur de configuration.Le code suivant :
PositionOptions
à la section Position
.Position
.public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
ConfigurationBinder.Get<T>
lie et retourne le type spécifié. Il peut être plus pratique d’utiliser ConfigurationBinder.Get<T>
que ConfigurationBinder.Bind
. Le code suivant illustre la classe ConfigurationBinder.Get<T>
avec la classe PositionOptions
:
public class Test21Model : PageModel
{
private readonly IConfiguration Configuration;
public PositionOptions? positionOptions { get; private set; }
public Test21Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
Une autre approche lors de l’utilisation du modèle d’options consiste à lier la section Position
et à l’ajouter au conteneur de service d’injection de dépendances. Dans le code suivant, PositionOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
À l’aide du code précédent, le code suivant lit les options de position :
public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
Dans le code précédent, les modifications apportées au fichier de configuration JSON après le démarrage de l’application ne sont pas lues. Pour lire les modifications après que l’application a démarré, utilisez IOptionsSnapshot.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
Consultez Fournisseur de configuration JSON dans ce document pour plus d’informations sur l’ajout de fichiers de configuration JSON.
Examinons les éléments suivants permettant d’inscrire les services et de configurer les options :
using ConfigSample.Options;
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
builder.Services.Configure<ColorOptions>(
builder.Configuration.GetSection(ColorOptions.Color));
builder.Services.AddScoped<IMyDependency, MyDependency>();
builder.Services.AddScoped<IMyDependency2, MyDependency2>();
var app = builder.Build();
Les groupes d’inscriptions associés peuvent être déplacés vers une méthode d’extension pour inscrire les services. Les services de configuration sont par exemple ajoutés à la classe suivante :
using ConfigSample.Options;
using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.DependencyInjection
{
public static class MyConfigServiceCollectionExtensions
{
public static IServiceCollection AddConfig(
this IServiceCollection services, IConfiguration config)
{
services.Configure<PositionOptions>(
config.GetSection(PositionOptions.Position));
services.Configure<ColorOptions>(
config.GetSection(ColorOptions.Color));
return services;
}
public static IServiceCollection AddMyDependencyGroup(
this IServiceCollection services)
{
services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<IMyDependency2, MyDependency2>();
return services;
}
}
}
Les services qui restent sont inscrits dans une classe similaire. Le code suivant utilise les nouvelles méthodes d’extension pour inscrire les services :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Remarque : chaque méthode d’extension services.Add{GROUP_NAME}
ajoute des services et les configure éventuellement. Par exemple, AddControllersWithViews ajoute les services nécessaires à MVC avec vues et AddRazorPages ajoute les services nécessaires aux pages Razor.
Instructions relatives aux données de configuration :
Par défaut, la source de configuration des secrets de l’utilisateur est inscrite après les sources de configuration JSON. Par conséquent, les clés des secrets utilisateur sont prioritaires sur les clés dans appsettings.json
et appsettings.{Environment}.json
.
Pour plus d’informations sur le stockage des mots de passe ou d’autres données sensibles :
Les variables d’environnement sans préfixe sont des variables d’environnement autres que celles avec le préfixe ASPNETCORE_
ou DOTNET_
. Par exemple, l’ensemble de modèles d’application web ASP.NET Core "ASPNETCORE_ENVIRONMENT": "Development"
dans launchSettings.json
. Pour plus d’informations sur les variables d’environnement ASPNETCORE_
et DOTNET_
, consultez :
ASPNETCORE_
et avec le préfixe DOTNETCORE_
.DOTNET_
variables d’environnement utilisées en dehors de Microsoft.Extensions.Hosting.À l’aide de la configuration par défaut, EnvironmentVariablesConfigurationProvider charge la configuration à partir de paires clé-valeur d’environnement après avoir lu appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur. Par conséquent, les valeurs de clés lues à partir de l’environnement remplacent les valeurs lues à partir de appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur.
Le séparateur :
ne fonctionne pas avec les clés hiérarchiques des variables d’environnement sur toutes les plateformes. Par exemple, le séparateur :
n’est pas pris en charge par Bash. Le double trait de soulignement __
est :
:
.Les commandes suivantes permettent de :
dotnet run
doit être exécutée dans le répertoire du projet.set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
Paramètres d’environnement précédents :
Les commandes setx suivantes peuvent être utilisées pour définir les clés et les valeurs d’environnement sur Windows. Contrairement à set
, les paramètres setx
sont persistants. /M
définit la variable dans l’environnement système. Si le commutateur /M
n’est pas utilisé, une variable d’environnement utilisateur est définie.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Pour vérifier que les commandes précédentes remplacent appsettings.json
et appsettings.{Environment}.json
:
dotnet run
.Appelez AddEnvironmentVariables avec une chaîne pour spécifier un préfixe pour les variables d’environnement :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
Dans le code précédent :
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.MyCustomPrefix_
remplacent les fournisseurs de configuration par défaut. Il s’agit notamment des variables d’environnement sans le préfixe.Le préfixe est supprimé quand les paires clé-valeur de la configuration sont lues.
Les commandes suivantes testent le préfixe personnalisé :
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
La configuration par défaut charge les variables d’environnement et les arguments de ligne de commande précédés du préfixe DOTNET_
et ASPNETCORE_
. Les préfixes DOTNET_
et ASPNETCORE_
sont utilisés par ASP.NET Core pour la configuration de l’hôte et de l’application, mais pas pour la configuration de l’utilisateur. Pour plus d’informations sur la configuration de l’hôte et de l’application, consultez Hôte générique .NET.
Dans Azure App Service, sélectionnez Nouveau paramètre d’application dans la page Paramètres > Configuration. Les paramètres d’application Azure App Service sont :
Pour plus d’informations, consultez Azure Apps : remplacer la configuration de l’application à l’aide du portail Azure.
Consultez Préfixes des chaînes de connexion pour plus d’informations sur les chaînes de connexion de base de données Azure.
Les noms de variable d’environnement reflètent la structure d’un fichier appsettings.json
. Chaque élément de la hiérarchie est séparé par un trait de soulignement double (solution préférable) ou par deux-points. Quand la structure de l’élément comprend un tableau, l’index du tableau doit être traité comme un nom d’élément supplémentaire dans ce chemin d’accès. Examinons le fichier appsettings.json
suivant et les valeurs équivalentes représentées sous forme de variables d’environnement.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Variables d’environnement
setx SmtpServer smtp.example.com
setx Logging__0__Name ToEmail
setx Logging__0__Level Critical
setx Logging__0__Args__FromAddress MySystem@example.com
setx Logging__0__Args__ToAddress SRE@example.com
setx Logging__1__Name ToConsole
setx Logging__1__Level Information
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système. Par exemple, les modèles web ASP.NET Core génèrent un fichier launchSettings.json
qui définit la configuration du point de terminaison sur :
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Configurer applicationUrl
permet de définir la variable d’environnement ASPNETCORE_URLS
et de remplacer les valeurs définies dans l’environnement.
Sur Linux, la valeur des variables d’environnement d’URL doit être placée dans une séquence d’échappement pour que systemd
puisse l’analyser. Utiliser l’outil Linux systemd-escape
qui interrompt http:--localhost:5001
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Le code suivant affiche les variables d’environnement et les valeurs au démarrage de l’application, ce qui peut être utile lors du débogage des paramètres d’environnement :
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
À l’aide de la configuration par défaut, CommandLineConfigurationProvider charge la configuration à partir de paires clé-valeur d’argument de ligne de commande après les sources de configuration suivantes :
appsettings.json
et appsettings.{Environment}.json
.Par défaut, les valeurs de configuration définies sur la ligne de commande remplacent les valeurs de configuration définies avec tous les autres fournisseurs de configuration.
La commande suivante définit des clés et des valeurs à l’aide de =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
Valeur de clé :
=
ou la clé doit avoir un préfixe --
ou /
quand la valeur suit un espace.=
est utilisée. Par exemple, MySetting=
Dans la même commande, ne mélangez pas des paires clé-valeur de l’argument de ligne de commande qui utilisent =
avec des paires clé-valeur qui utilisent un espace.
Les correspondances de commutateur permettent une logique de remplacement des noms de clé. Fournit un dictionnaire des remplacements de commutateur à la méthode AddCommandLine.
Quand le dictionnaire de correspondances de commutateur est utilisé, il est vérifié afin de déterminer s’il contient une clé correspondant à celle fournie par un argument de ligne de commande. Si la clé de ligne de commande est trouvée dans le dictionnaire, la valeur du dictionnaire est retournée pour définir la paire clé-valeur dans la configuration de l’application. Une correspondance de commutateur est nécessaire pour chaque clé de ligne de commande préfixée avec un tiret unique (-
).
Règles des clés du dictionnaire de correspondances de commutateur :
-
ou --
.Pour utiliser un dictionnaire de correspondances de commutateur, transmettez-le dans l’appel à AddCommandLine
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var switchMappings = new Dictionary<string, string>()
{
{ "-k1", "key1" },
{ "-k2", "key2" },
{ "--alt3", "key3" },
{ "--alt4", "key4" },
{ "--alt5", "key5" },
{ "--alt6", "key6" },
};
builder.Configuration.AddCommandLine(args, switchMappings);
var app = builder.Build();
Exécutez la commande suivante pour tester le remplacement de la clé :
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
Le code suivant montre les valeurs de clé pour les clés remplacées :
public class Test3Model : PageModel
{
private readonly IConfiguration Config;
public Test3Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
return Content(
$"Key1: '{Config["Key1"]}'\n" +
$"Key2: '{Config["Key2"]}'\n" +
$"Key3: '{Config["Key3"]}'\n" +
$"Key4: '{Config["Key4"]}'\n" +
$"Key5: '{Config["Key5"]}'\n" +
$"Key6: '{Config["Key6"]}'");
}
}
Pour les applications qui utilisent des mappages de commutateurs, l’appel à CreateDefaultBuilder
ne doit pas passer d’arguments. L’appel AddCommandLine
de la méthode CreateDefaultBuilder
n’inclut pas de commutateurs mappés. Il n’existe aucun moyen de transmettre le dictionnaire de mappage de commutateur à CreateDefaultBuilder
. La solution ne consiste pas à transmettre les arguments à CreateDefaultBuilder
, mais à permettre à la méthode AddCommandLine
de la méthode ConfigurationBuilder
de traiter à la fois les arguments et le dictionnaire de correspondance de commutateur.
Les arguments d’environnement et de ligne de commande peuvent être définis dans Visual Studio à partir de la boîte de dialogue Profils de lancement :
L’API de configuration lit les données de configuration hiérarchiques en aplanissant les données hiérarchiques à l’aide d’un délimiteur dans les clés de configuration.
L’exemple de téléchargement contient le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
La meilleure méthode pour lire les données de configuration hiérarchiques consiste à utiliser le modèle d’options. Pour plus d’informations, consultez Lier des données de configuration hiérarchiques à l’aide du modèle d’options dans ce document.
Les méthodes GetSection et GetChildren sont disponibles pour isoler les sections et les enfants d’une section dans les données de configuration. Ces méthodes sont décrites plus loin dans GetSection, GetChildren et Exists.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
Clés de configuration :
ConnectionString
et connectionstring
sont traités en tant que clés équivalentes.:
) fonctionne sur toutes les plateformes.__
est pris en charge par toutes les plateformes. Il est automatiquement transformé en signe deux-points :
.--
comme séparateur. Le fournisseur de configuration Azure Key Vault remplace automatiquement --
par :
quand les secrets sont chargés dans la configuration de l’application.Valeurs de configuration :
Le tableau suivant présente les fournisseurs de configuration disponibles pour les applications ASP.NET Core.
Fournisseur | Fournit la configuration à partir de |
---|---|
Fournisseur de configuration Azure Key Vault | Azure Key Vault |
Fournisseur de configuration Azure App | Azure App Configuration |
Fournisseur de configuration de ligne de commande | Paramètres de ligne de commande |
Fournisseur de configuration personnalisé | Source personnalisée |
Fournisseur de configuration de variables d’environnement | Variables d'environnement |
Fournisseur de configuration de fichier | Fichiers INI, JSON et XML |
Fournisseur de configuration clé par fichier | Fichiers de répertoire |
Fournisseur de configuration de mémoire | Collections en mémoire |
Secrets utilisateur | Fichier dans le répertoire de profil utilisateur |
Les sources de configuration sont lues dans l’ordre où leurs fournisseurs de configuration sont spécifiés. Organisez les fournisseurs de configuration dans le code en fonction des priorités pour les sources de configuration sous-jacentes nécessaires pour l’application.
Une séquence type des fournisseurs de configuration est la suivante :
appsettings.json
appsettings.{Environment}.json
Une pratique courante consiste à ajouter le fournisseur de configuration de ligne de commande en dernier dans une série de fournisseurs pour permettre aux arguments de ligne de commande de remplacer la configuration définie par les autres fournisseurs.
La séquence de fournisseurs précédente est utilisée dans la configuration par défaut.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
L’API de configuration présente des règles de traitement spéciales pour quatre variables d’environnement de chaîne de connexion. Ces chaînes de connexion sont impliquées dans la configuration des chaînes de connexion Azure pour l’environnement de l’application. Les variables d’environnement avec les préfixes indiqués dans le tableau sont chargées dans l’application avec la configuration par défaut ou si aucun préfixe n’est fourni à AddEnvironmentVariables
.
Préfixe de la chaîne de connexion | Fournisseur |
---|---|
CUSTOMCONNSTR_ |
Fournisseur personnalisé |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Quand une variable d’environnement est découverte et chargée dans la configuration avec l’un des quatre préfixes indiqués dans le tableau :
ConnectionStrings
).CUSTOMCONNSTR_
, qui ne possède aucun fournisseur indiqué).Clé de variable d’environnement | Clé de configuration convertie | Entrée de configuration de fournisseur |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Entrée de configuration non créée. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
FileConfigurationProvider est la classe de base pour charger la configuration à partir du système de fichiers. Les fournisseurs de configuration suivants dérivent de FileConfigurationProvider
:
IniConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier INI lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true)
.AddIniFile($"MyIniConfig.{builder.Environment.EnvironmentName}.ini",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyIniConfig.ini
et MyIniConfig.{Environment}.ini
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyIniConfig.ini
suivant :
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
JsonConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier JSON.
Les surcharges permettent de spécifier :
Prenez le code suivant :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("MyConfig.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code précédent :
MyConfig.json
avec les options suivantes :optional: true
: le fichier est facultatif.reloadOnChange: true
: le fichier est rechargé quand des modifications sont enregistrées.MyConfig.json
. Les paramètres dans le fichier MyConfig.json
remplacent les paramètres par défaut dans les fournisseurs de configuration, notamment le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.En règle générale, vous ne souhaitez pas qu’un fichier JSON personnalisé écrase les valeurs définies dans le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.
XmlConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier XML lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true)
.AddXmlFile($"MyXMLFile.{builder.Environment.EnvironmentName}.xml",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyXMLFile.xml
et MyXMLFile.{Environment}.xml
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyXMLFile.xml
suivant :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Les éléments répétitifs qui utilisent le même nom d’élément fonctionnent si l’attribut name
est utilisé pour distinguer les éléments :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="section0">
<key name="key0">value 00</key>
<key name="key1">value 01</key>
</section>
<section name="section1">
<key name="key0">value 10</key>
<key name="key1">value 11</key>
</section>
</configuration>
Le code suivant lit le fichier de configuration précédent et affiche les clés et les valeurs :
public class IndexModel : PageModel
{
private readonly IConfiguration Configuration;
public IndexModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var key00 = "section:section0:key:key0";
var key01 = "section:section0:key:key1";
var key10 = "section:section1:key:key0";
var key11 = "section:section1:key:key1";
var val00 = Configuration[key00];
var val01 = Configuration[key01];
var val10 = Configuration[key10];
var val11 = Configuration[key11];
return Content($"{key00} value: {val00} \n" +
$"{key01} value: {val01} \n" +
$"{key10} value: {val10} \n" +
$"{key10} value: {val11} \n"
);
}
}
Les attributs peuvent être utilisés pour fournir des valeurs :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
Le fichier de configuration précédent charge les clés suivantes avec value
:
Le KeyPerFileConfigurationProvider utilise les fichiers d’un répertoire en tant que paires clé-valeur de configuration. La clé est le nom de fichier. La valeur contient le contenu du fichier. Le fournisseur de configuration Clé par fichier est utilisé dans les scénarios d’hébergement de Docker.
Pour activer la configuration clé par fichier, appelez la méthode d’extension AddKeyPerFile sur une instance de ConfigurationBuilder. Le directoryPath
aux fichiers doit être un chemin d’accès absolu.
Les surcharges permettent de spécifier :
Action<KeyPerFileConfigurationSource>
qui configure la source.Le double trait de soulignement (__
) est utilisé comme un délimiteur de clé de configuration dans les noms de fichiers. Par exemple, le nom de fichier Logging__LogLevel__System
génère la clé de configuration Logging:LogLevel:System
.
Appelez ConfigureAppConfiguration
lors de la création de l’hôte pour spécifier la configuration de l’application :
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Le MemoryConfigurationProvider utilise une collection en mémoire en tant que paires clé-valeur de configuration.
Le code suivant ajoute une collection en mémoire au système de configuration :
var builder = WebApplication.CreateBuilder(args);
var Dict = new Dictionary<string, string>
{
{"MyKey", "Dictionary MyKey Value"},
{"Position:Title", "Dictionary_Title"},
{"Position:Name", "Dictionary_Name" },
{"Logging:LogLevel:Default", "Warning"}
};
builder.Configuration.AddInMemoryCollection(Dict);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant de l’exemple de téléchargement affiche les paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Dans le code précédent, config.AddInMemoryCollection(Dict)
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.
Consultez Lier un tableau pour un autre exemple utilisant MemoryConfigurationProvider
.
Kestrel la configuration d’un point de terminaison spécifique remplace toutes les configurations de point de terminaison entre serveurs. Les configurations de point de terminaison entre serveurs comprennent notamment :
--urls
sur la ligne de commandeASPNETCORE_URLS
Examinons le fichier appsettings.json
utilisé dans une application web ASP.NET Core :
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Quand le balisage en surbrillance précédent est utilisé dans une application web ASP.NET Core et que l’application est lancée sur la ligne de commande avec la configuration de point de terminaison entre serveurs suivante :
dotnet run --urls="https://localhost:7777"
Kestrel crée une liaison vers le point de terminaison configuré spécifiquement pour Kestrel dans le fichier appsettings.json
(https://localhost:9999
) et non https://localhost:7777
.
Examinons le point de terminaison spécifique Kestrel configuré comme une variable d’environnement :
set Kestrel__Endpoints__Https__Url=https://localhost:8888
Dans la variable d’environnement précédente, Https
est le nom du point de terminaison spécifique Kestrel. Le fichier appsettings.json
précédent définit également un point de terminaison spécifique Kestrel nommé Https
. Par défaut, les variables d’environnement utilisant le fournisseur de configuration des variables d’environnement sont lues après appsettings.{Environment}.json
. Par conséquent, la variable d’environnement précédente est utilisée pour le point de terminaison Https
.
ConfigurationBinder.GetValue extrait une valeur unique de la configuration avec une clé spécifiée et la convertit selon le type spécifié :
public class TestNumModel : PageModel
{
private readonly IConfiguration Configuration;
public TestNumModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var number = Configuration.GetValue<int>("NumberKey", 99);
return Content($"{number}");
}
}
Dans le code précédent, si NumberKey
est introuvable dans la configuration, la valeur par défaut de 99
est utilisée.
Pour les exemples suivants, utilisez le fichier MySubsection.json
suivant :
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
Le code suivant ajoute MySubsection.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
IConfiguration.GetSection retourne une sous-section de la configuration avec la clé de sous-section spécifiée.
Le code suivant retourne les valeurs pour section1
:
public class TestSectionModel : PageModel
{
private readonly IConfiguration Config;
public TestSectionModel(IConfiguration configuration)
{
Config = configuration.GetSection("section1");
}
public ContentResult OnGet()
{
return Content(
$"section1:key0: '{Config["key0"]}'\n" +
$"section1:key1: '{Config["key1"]}'");
}
}
Le code suivant retourne les valeurs pour section2:subsection0
:
public class TestSection2Model : PageModel
{
private readonly IConfiguration Config;
public TestSection2Model(IConfiguration configuration)
{
Config = configuration.GetSection("section2:subsection0");
}
public ContentResult OnGet()
{
return Content(
$"section2:subsection0:key0 '{Config["key0"]}'\n" +
$"section2:subsection0:key1:'{Config["key1"]}'");
}
}
GetSection
ne retourne jamais null
. Si aucune section correspondante n’est trouvée, une valeur IConfigurationSection
vide est retournée.
Quand GetSection
retourne une section correspondante, Value n’est pas rempli. Key et Path sont retournés quand la section existe.
Le code suivant appelle IConfiguration.GetChildren et retourne les valeurs pour section2:subsection0
:
public class TestSection4Model : PageModel
{
private readonly IConfiguration Config;
public TestSection4Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
string s = "";
var selection = Config.GetSection("section2");
if (!selection.Exists())
{
throw new Exception("section2 does not exist.");
}
var children = selection.GetChildren();
foreach (var subSection in children)
{
int i = 0;
var key1 = subSection.Key + ":key" + i++.ToString();
var key2 = subSection.Key + ":key" + i.ToString();
s += key1 + " value: " + selection[key1] + "\n";
s += key2 + " value: " + selection[key2] + "\n";
}
return Content(s);
}
}
Le code précédent appelle ConfigurationExtensions.Exists pour vérifier que la section existe :
ConfigurationBinder.Bind prend en charge la liaison de tableaux à des objets à l’aide d’index de tableau dans les clés de configuration. Tout format de tableau qui expose un segment de clé numérique est capable d’effectuer la liaison de tableau avec un tableau de classes POCO.
Examinons MyArray.json
dans l’exemple de téléchargement :
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
Le code suivant ajoute MyArray.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant lit la configuration et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample? _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
if (_array == null)
{
throw new ArgumentNullException(nameof(_array));
}
string s = String.Empty;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
public class ArrayExample
{
public string[]? Entries { get; set; }
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
Dans la sortie précédente, l’index 3 a la valeur value40
, ce qui correspond à "4": "value40",
dans MyArray.json
. Les index de tableau lié sont contenus et ne sont pas liés à l’index de clé de configuration. Le binder de configuration n’est pas en mesure de lier des valeurs null, ni de créer des entrées null dans des objets liés.
L’exemple d’application montre comment créer un fournisseur de configuration de base qui lit les paires clé-valeur de configuration à partir d’une base de données à l’aide d’Entity Framework (EF).
Le fournisseur présente les caractéristiques suivantes :
ConfigurationBuilder
pour fournir la chaîne de connexion à partir d’un autre fournisseur de configuration.Définissez une entité EFConfigurationValue
pour le stockage des valeurs de configuration dans la base de données.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Ajoutez un EFConfigurationContext
pour stocker les valeurs configurées et y accéder.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Créez une classe qui implémente IConfigurationSource.
EFConfigurationProvider/EFConfigurationSource.cs
:
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction) => _optionsAction = optionsAction;
public IConfigurationProvider Build(IConfigurationBuilder builder) => new EFConfigurationProvider(_optionsAction);
}
Créez le fournisseur de configuration personnalisé en héritant de ConfigurationProvider. Le fournisseur de configuration initialise la base de données quand elle est vide. Étant donné que les clés de configuration ne respectent pas la casse, le dictionnaire utilisé pour initialiser la base de données est créé avec le comparateur ne respectant pas la casse (StringComparer.OrdinalIgnoreCase).
EFConfigurationProvider/EFConfigurationProvider.cs
:
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity-2005
var configValues =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
Une méthode d’extension AddEFConfiguration
permet d’ajouter la source de configuration à un ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
Le code suivant montre comment utiliser le EFConfigurationProvider
personnalisé dans Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
La configuration peut être injectée dans des services à l’aide de l’injection de dépendances en résolvant le service IConfiguration :
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Pour plus d’informations sur l’accès aux valeurs à l’aide de IConfiguration
, consultez GetValue et GetSection, GetChildren et Exists dans cet article.
Le code suivant affiche les données de configuration dans une page Razor :
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Dans le code suivant, MyOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
Le balisage suivant utilise la directive @inject
Razor pour résoudre et afficher les valeurs des options :
@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@using SampleApp.Models
@inject IOptions<MyOptions> optionsAccessor
<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>
Le code suivant affiche les données de configuration dans une vue MVC :
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Le code suivant accède à la configuration dans le fichier Program.cs
.
var builder = WebApplication.CreateBuilder(args);
var key1 = builder.Configuration.GetValue<string>("KeyOne");
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
var key2 = app.Configuration.GetValue<int>("KeyTwo");
var key3 = app.Configuration.GetValue<bool>("KeyThree");
app.Logger.LogInformation("KeyOne: {KeyOne}", key1);
app.Logger.LogInformation("KeyTwo: {KeyTwo}", key2);
app.Logger.LogInformation("KeyThree: {KeyThree}", key3);
app.Run();
Dans appsettings.json
pour l’exemple précédent :
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Les options configurées dans un délégué remplacent les valeurs définies dans les fournisseurs de configuration.
Dans le code suivant, un service IConfigureOptions<TOptions> est ajouté au conteneur de services. Il utilise un délégué pour configurer les valeurs pour MyOptions
:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
});
var app = builder.Build();
Le code suivant affiche les valeurs d’options :
public class Test2Model : PageModel
{
private readonly IOptions<MyOptions> _optionsDelegate;
public Test2Model(IOptions<MyOptions> optionsDelegate )
{
_optionsDelegate = optionsDelegate;
}
public ContentResult OnGet()
{
return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
$"Option2: {_optionsDelegate.Value.Option2}");
}
}
Dans l’exemple précédent, les valeurs de Option1
et Option2
sont spécifiées dans appsettings.json
, puis remplacées par le délégué configuré.
Avant que l’application ne soit configurée et démarrée, un hôte est configuré et lancé. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. L’application et l’hôte sont configurés à l’aide des fournisseurs de configuration décrits dans cette rubrique. Les paires clé-valeur de la configuration de l’hôte sont également incluses dans la configuration de l’application. Pour plus d’informations sur l’utilisation des fournisseurs de configuration lors de la génération de l’hôte et sur l’impact des sources de configuration sur la configuration de l’hôte, consultez Vue d’ensemble des notions de base d’ASP.NET Core.
Pour plus de détails sur la configuration par défaut lors de l’utilisation de l’hôte Web, consultez la version ASP.NET Core 2.2. de cette rubrique.
DOTNET_
(par exemple DOTNET_ENVIRONMENT
) avec le fournisseur de configuration des variables d’environnement. Le préfixe (DOTNET_
) est supprimé lorsque les paires clé-valeur de la configuration sont chargées.ConfigureWebHostDefaults
) : ASPNETCORE_FORWARDEDHEADERS_ENABLED
est définie sur true
.Cette rubrique se rapporte uniquement à la configuration des applications. D’autres aspects concernant l’exécution et l’hébergement des applications ASP.NET Core sont configurés à l’aide des fichiers de configuration qui ne sont pas abordés dans cette rubrique :
launch.json
/launchSettings.json
sont des fichiers de configuration d’outils pour l’environnement de développement, décrits ci-après : web.config
est un fichier de configuration de serveur décrit dans les rubriques suivantes :
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système.
Pour plus d’informations sur la migration de la configuration d’application à partir de versions antérieures d’ASP.NET, consultez Effectuer une mise à jour d’ASP.NET vers ASP.NET Core.
Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup
de l’application. Pour plus d’informations, consultez Utiliser des assemblys d’hébergement au démarrage dans ASP.NET Core.
Le générateur de source de liaison de configuration fournit une configuration AOT et conviviale. Pour plus d’informations, consultez le générateur de source de liaison de configuration.
La configuration de l’application dans ASP.NET Core est effectuée à l’aide d’un ou de plusieurs fournisseurs de configuration. Les fournisseurs de configuration lisent les données de configuration de paires clé-valeur à l’aide de diverses sources de configuration :
appsettings.json
Cet article fournit des informations sur la configuration dans ASP.NET Core. Pour plus d’informations sur l’utilisation de la configuration dans des applications de console, consultez Configuration .NET.
Les applications ASP.NET Core configurent et lancent un hôte. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. Les modèles ASP.NET Core créent un WebApplicationBuilder qui contient l’hôte. Une configuration peut être effectuée à la fois dans les fournisseurs de configuration de l’hôte et de l’application. Toutefois, seule la configuration nécessaire à l’hôte doit généralement être effectuée dans la configuration de l’hôte.
La configuration de l’application représente la priorité la plus élevée. Elle est détaillée dans la section suivante. La configuration de l’hôte suit la configuration de l’application. Elle est décrite dans cet article.
Les applications web ASP.NET Core créées avec dotnet new ou Visual Studio génèrent le code suivant :
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialise une nouvelle instance de la classe WebApplicationBuilder avec les valeurs par défaut préconfigurées. Le WebApplicationBuilder
(builder
) initialisé fournit la configuration de l’application par défaut dans l’ordre suivant, de la priorité la plus élevée à la plus basse :
Development
appsettings.{Environment}.json
avec le fournisseur de configuration JSON. Par exemple : appsettings.Production.json
et appsettings.Development.json
.La liste suivante contient les sources de configuration de l’hôte par défaut de la priorité la plus élevée à la plus basse pour WebApplicationBuilder :
DOTNET_
avec le fournisseur de configuration des variables d’environnement.ASPNETCORE_
avec le fournisseur de configuration des variables d’environnement.Pour l’hôte générique .NET et l’hôte web, les sources de configuration de l’hôte par défaut de la priorité la plus élevée à la priorité la plus basse sont les suivantes :
ASPNETCORE_
avec le fournisseur de configuration des variables d’environnement.DOTNET_
avec le fournisseur de configuration des variables d’environnement.Quand une valeur de configuration est définie dans la configuration de l’hôte et de l’application, la configuration de l’application est utilisée.
Les variables suivantes sont verrouillées au début lors de l’initialisation des générateurs d’hôtes. Elles ne peuvent pas être affectées via la configuration de l’application :
Development
, Production
et Staging
Tous les autres paramètres d’hôte sont lus à partir de la configuration de l’application et non de la configuration de l’hôte.
URLS
est l’un des nombreux paramètres courants de l’hôte qui n’est pas un paramètre d’amorçage. Comme tous les autres paramètres d’hôte ne figurant pas dans la liste précédente, URLS
est lu ultérieurement à partir de la configuration de l’application. La configuration de l’hôte est une solution de secours pour la configuration de l’application. La configuration de l’hôte peut donc être utilisée pour définir URLS
, mais elle sera remplacée par toute source de configuration dans la configuration de l’application, comme appsettings.json
.
Pour plus d’informations, consultez Modifier la racine du contenu, le nom de l’application et l’environnement et Modifier la racine du contenu, le nom de l’application et l’environnement à l’aide de variables d’environnement ou de la ligne de commande
Les sections suivantes de cet article font référence à la configuration de l’application.
Le code suivant affiche les fournisseurs de configuration activés dans l’ordre dans lequel ils ont été ajoutés :
public class Index2Model : PageModel
{
private IConfigurationRoot ConfigRoot;
public Index2Model(IConfiguration configRoot)
{
ConfigRoot = (IConfigurationRoot)configRoot;
}
public ContentResult OnGet()
{
string str = "";
foreach (var provider in ConfigRoot.Providers.ToList())
{
str += provider.ToString() + "\n";
}
return Content(str);
}
}
La liste des sources de configuration par défaut classées de la priorité la plus élevée à la plus basse précédente affiche les fournisseurs dans l’ordre inverse de leur ajout à l’application générée par le modèle. Par exemple, le fournisseur de configuration JSON est ajouté avant le fournisseur de configuration de ligne de commande.
Les fournisseurs de configuration ajoutés ultérieurement ont une priorité plus élevée. Ils remplacent les paramètres de clé précédents. Par exemple, si MyKey
est défini dans appsettings.json
et dans l’environnement, la valeur d’environnement est utilisée. À l’aide des fournisseurs de configuration par défaut, le fournisseur de configuration de ligne de commande remplace les valeurs de tous les autres fournisseurs.
Pour plus d’informations sur CreateBuilder
, consultez Paramètres du générateur par défaut.
Examinons le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Le JsonConfigurationProvider par défaut charge la configuration dans l’ordre suivant :
appsettings.json
appsettings.{Environment}.json
: par exemple les fichiers appsettings.Production.json
et appsettings.Development.json
. La version de l’environnement du fichier est chargée en fonction de IHostingEnvironment.EnvironmentName. Pour plus d’informations, consultez Utiliser plusieurs environnements dans ASP.NET Core.Les valeurs appsettings.{Environment}.json
remplacent les clés dans appsettings.json
. Par exemple, par défaut :
appsettings.Development.json
remplace les valeurs trouvées dans appsettings.json
.appsettings.Production.json
remplace les valeurs trouvées dans appsettings.json
. Par exemple, lors du déploiement de l’application sur Azure.Si une valeur de configuration doit être garantie, consultez GetValue. L’exemple précédent lit uniquement les chaînes. Il ne prend pas en charge de valeur par défaut.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
Les commentaires dans les fichiers appsettings.json
et appsettings.{Environment}.json
sont pris en charge à l’aide des commentaires de style JavaScript ou C#.
La meilleure méthode pour lire les valeurs de configuration associées consiste à utiliser le modèle d’options. Par exemple, pour lire les valeurs de configuration suivantes :
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Créez la classe PositionOptions
suivante :
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Classe d’options :
Position
n’est pas lié. Le champ Position
est utilisé pour qu’il ne soit pas nécessaire de coder la chaîne "Position"
en dur dans l’application lors de la liaison de la classe à un fournisseur de configuration.Le code suivant :
PositionOptions
à la section Position
.Position
.public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
ConfigurationBinder.Get<T>
lie et retourne le type spécifié. Il peut être plus pratique d’utiliser ConfigurationBinder.Get<T>
que ConfigurationBinder.Bind
. Le code suivant illustre la classe ConfigurationBinder.Get<T>
avec la classe PositionOptions
:
public class Test21Model : PageModel
{
private readonly IConfiguration Configuration;
public PositionOptions? positionOptions { get; private set; }
public Test21Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
Une autre approche lors de l’utilisation du modèle d’options consiste à lier la section Position
et à l’ajouter au conteneur de service d’injection de dépendances. Dans le code suivant, PositionOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
À l’aide du code précédent, le code suivant lit les options de position :
public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
Dans le code précédent, les modifications apportées au fichier de configuration JSON après le démarrage de l’application ne sont pas lues. Pour lire les modifications après que l’application a démarré, utilisez IOptionsSnapshot.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
Consultez Fournisseur de configuration JSON dans ce document pour plus d’informations sur l’ajout de fichiers de configuration JSON.
Examinons les éléments suivants permettant d’inscrire les services et de configurer les options :
using ConfigSample.Options;
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
builder.Services.Configure<ColorOptions>(
builder.Configuration.GetSection(ColorOptions.Color));
builder.Services.AddScoped<IMyDependency, MyDependency>();
builder.Services.AddScoped<IMyDependency2, MyDependency2>();
var app = builder.Build();
Les groupes d’inscriptions associés peuvent être déplacés vers une méthode d’extension pour inscrire les services. Les services de configuration sont par exemple ajoutés à la classe suivante :
using ConfigSample.Options;
using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.DependencyInjection
{
public static class MyConfigServiceCollectionExtensions
{
public static IServiceCollection AddConfig(
this IServiceCollection services, IConfiguration config)
{
services.Configure<PositionOptions>(
config.GetSection(PositionOptions.Position));
services.Configure<ColorOptions>(
config.GetSection(ColorOptions.Color));
return services;
}
public static IServiceCollection AddMyDependencyGroup(
this IServiceCollection services)
{
services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<IMyDependency2, MyDependency2>();
return services;
}
}
}
Les services qui restent sont inscrits dans une classe similaire. Le code suivant utilise les nouvelles méthodes d’extension pour inscrire les services :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Remarque : chaque méthode d’extension services.Add{GROUP_NAME}
ajoute des services et les configure éventuellement. Par exemple, AddControllersWithViews ajoute les services nécessaires à MVC avec vues et AddRazorPages ajoute les services nécessaires aux pages Razor.
Instructions relatives aux données de configuration :
Par défaut, la source de configuration des secrets de l’utilisateur est inscrite après les sources de configuration JSON. Par conséquent, les clés des secrets utilisateur sont prioritaires sur les clés dans appsettings.json
et appsettings.{Environment}.json
.
Pour plus d’informations sur le stockage des mots de passe ou d’autres données sensibles :
Azure Key Vault stocke en toute sécurité des secrets d’application pour les applications ASP.NET Core. Pour plus d’informations, consultez Fournisseur de configuration Azure Key Vault dans ASP.NET Core.
Les variables d’environnement sans préfixe sont des variables d’environnement autres que celles avec le préfixe ASPNETCORE_
ou DOTNET_
. Par exemple, l’ensemble de modèles d’application web ASP.NET Core "ASPNETCORE_ENVIRONMENT": "Development"
dans launchSettings.json
. Pour plus d’informations sur les variables d’environnement ASPNETCORE_
et DOTNET_
, consultez :
ASPNETCORE_
et avec le préfixe DOTNETCORE_
.DOTNET_
variables d’environnement utilisées en dehors de Microsoft.Extensions.Hosting.À l’aide de la configuration par défaut, EnvironmentVariablesConfigurationProvider charge la configuration à partir de paires clé-valeur d’environnement après avoir lu appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur. Par conséquent, les valeurs de clés lues à partir de l’environnement remplacent les valeurs lues à partir de appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur.
Le séparateur :
ne fonctionne pas avec les clés hiérarchiques des variables d’environnement sur toutes les plateformes. Par exemple, le séparateur :
n’est pas pris en charge par Bash. Le double trait de soulignement __
est :
:
.Les commandes suivantes set
permettent de :
dotnet run
doit être exécutée dans le répertoire du projet.set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
Paramètres d’environnement précédents :
Les commandes setx suivantes peuvent être utilisées pour définir les clés et les valeurs d’environnement sur Windows. Contrairement à set
, les paramètres setx
sont persistants. /M
définit la variable dans l’environnement système. Si le commutateur /M
n’est pas utilisé, une variable d’environnement utilisateur est définie.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Pour vérifier que les commandes précédentes remplacent appsettings.json
et appsettings.{Environment}.json
:
dotnet run
.Appelez AddEnvironmentVariables avec une chaîne pour spécifier un préfixe pour les variables d’environnement :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
Dans le code précédent :
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.MyCustomPrefix_
remplacent les fournisseurs de configuration par défaut. Il s’agit notamment des variables d’environnement sans le préfixe.Le préfixe est supprimé quand les paires clé-valeur de la configuration sont lues.
Les commandes suivantes testent le préfixe personnalisé :
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
La configuration par défaut charge les variables d’environnement et les arguments de ligne de commande précédés du préfixe DOTNET_
et ASPNETCORE_
. Les préfixes DOTNET_
et ASPNETCORE_
sont utilisés par ASP.NET Core pour la configuration de l’hôte et de l’application, mais pas pour la configuration de l’utilisateur. Pour plus d’informations sur la configuration de l’hôte et de l’application, consultez Hôte générique .NET.
Dans Azure App Service, sélectionnez Nouveau paramètre d’application dans la page Paramètres > Configuration. Les paramètres d’application Azure App Service sont :
Pour plus d’informations, consultez Azure Apps : remplacer la configuration de l’application à l’aide du portail Azure.
Consultez Préfixes des chaînes de connexion pour plus d’informations sur les chaînes de connexion de base de données Azure.
Les noms de variable d’environnement reflètent la structure d’un fichier appsettings.json
. Chaque élément de la hiérarchie est séparé par un trait de soulignement double (solution préférable) ou par deux-points. Quand la structure de l’élément comprend un tableau, l’index du tableau doit être traité comme un nom d’élément supplémentaire dans ce chemin d’accès. Examinons le fichier appsettings.json
suivant et les valeurs équivalentes représentées sous forme de variables d’environnement.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Variables d’environnement
setx SmtpServer smtp.example.com
setx Logging__0__Name ToEmail
setx Logging__0__Level Critical
setx Logging__0__Args__FromAddress MySystem@example.com
setx Logging__0__Args__ToAddress SRE@example.com
setx Logging__1__Name ToConsole
setx Logging__1__Level Information
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système. Par exemple, les modèles web ASP.NET Core génèrent un fichier launchSettings.json
qui définit la configuration du point de terminaison sur :
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Configurer applicationUrl
permet de définir la variable d’environnement ASPNETCORE_URLS
et de remplacer les valeurs définies dans l’environnement.
Sur Linux, la valeur des variables d’environnement d’URL doit être placée dans une séquence d’échappement pour que systemd
puisse l’analyser. Utiliser l’outil Linux systemd-escape
qui interrompt http:--localhost:5001
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Le code suivant affiche les variables d’environnement et les valeurs au démarrage de l’application, ce qui peut être utile lors du débogage des paramètres d’environnement :
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
À l’aide de la configuration par défaut, CommandLineConfigurationProvider charge la configuration à partir de paires clé-valeur d’argument de ligne de commande après les sources de configuration suivantes :
appsettings.json
et appsettings.{Environment}.json
.Par défaut, les valeurs de configuration définies sur la ligne de commande remplacent les valeurs de configuration définies avec tous les autres fournisseurs de configuration.
La commande suivante définit des clés et des valeurs à l’aide de =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
Valeur de clé :
=
ou la clé doit avoir un préfixe --
ou /
quand la valeur suit un espace.=
est utilisée. Par exemple, MySetting=
Dans la même commande, ne mélangez pas des paires clé-valeur de l’argument de ligne de commande qui utilisent =
avec des paires clé-valeur qui utilisent un espace.
Les correspondances de commutateur permettent une logique de remplacement des noms de clé. Fournit un dictionnaire des remplacements de commutateur à la méthode AddCommandLine.
Quand le dictionnaire de correspondances de commutateur est utilisé, il est vérifié afin de déterminer s’il contient une clé correspondant à celle fournie par un argument de ligne de commande. Si la clé de ligne de commande est trouvée dans le dictionnaire, la valeur du dictionnaire est retournée pour définir la paire clé-valeur dans la configuration de l’application. Une correspondance de commutateur est nécessaire pour chaque clé de ligne de commande préfixée avec un tiret unique (-
).
Règles des clés du dictionnaire de correspondances de commutateur :
-
ou --
.Pour utiliser un dictionnaire de correspondances de commutateur, transmettez-le dans l’appel à AddCommandLine
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var switchMappings = new Dictionary<string, string>()
{
{ "-k1", "key1" },
{ "-k2", "key2" },
{ "--alt3", "key3" },
{ "--alt4", "key4" },
{ "--alt5", "key5" },
{ "--alt6", "key6" },
};
builder.Configuration.AddCommandLine(args, switchMappings);
var app = builder.Build();
Exécutez la commande suivante pour tester le remplacement de la clé :
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
Le code suivant montre les valeurs de clé pour les clés remplacées :
public class Test3Model : PageModel
{
private readonly IConfiguration Config;
public Test3Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
return Content(
$"Key1: '{Config["Key1"]}'\n" +
$"Key2: '{Config["Key2"]}'\n" +
$"Key3: '{Config["Key3"]}'\n" +
$"Key4: '{Config["Key4"]}'\n" +
$"Key5: '{Config["Key5"]}'\n" +
$"Key6: '{Config["Key6"]}'");
}
}
Pour les applications qui utilisent des mappages de commutateurs, l’appel à CreateDefaultBuilder
ne doit pas passer d’arguments. L’appel AddCommandLine
de la méthode CreateDefaultBuilder
n’inclut pas de commutateurs mappés. Il n’existe aucun moyen de transmettre le dictionnaire de mappage de commutateur à CreateDefaultBuilder
. La solution ne consiste pas à transmettre les arguments à CreateDefaultBuilder
, mais à permettre à la méthode AddCommandLine
de la méthode ConfigurationBuilder
de traiter à la fois les arguments et le dictionnaire de correspondance de commutateur.
Les arguments d’environnement et de ligne de commande peuvent être définis dans Visual Studio à partir de la boîte de dialogue Profils de lancement :
L’API de configuration lit les données de configuration hiérarchiques en aplanissant les données hiérarchiques à l’aide d’un délimiteur dans les clés de configuration.
L’exemple de téléchargement contient le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
La meilleure méthode pour lire les données de configuration hiérarchiques consiste à utiliser le modèle d’options. Pour plus d’informations, consultez Lier des données de configuration hiérarchiques à l’aide du modèle d’options dans ce document.
Les méthodes GetSection et GetChildren sont disponibles pour isoler les sections et les enfants d’une section dans les données de configuration. Ces méthodes sont décrites plus loin dans GetSection, GetChildren et Exists.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
Clés de configuration :
ConnectionString
et connectionstring
sont traités en tant que clés équivalentes.:
) fonctionne sur toutes les plateformes.__
est pris en charge par toutes les plateformes. Il est automatiquement transformé en signe deux-points :
.--
comme séparateur. Le fournisseur de configuration Azure Key Vault remplace automatiquement --
par :
quand les secrets sont chargés dans la configuration de l’application.Valeurs de configuration :
Le tableau suivant présente les fournisseurs de configuration disponibles pour les applications ASP.NET Core.
Fournisseur | Fournit la configuration à partir de |
---|---|
Fournisseur de configuration Azure Key Vault | Azure Key Vault |
Fournisseur de configuration Azure App | Azure App Configuration |
Fournisseur de configuration de ligne de commande | Paramètres de ligne de commande |
Fournisseur de configuration personnalisé | Source personnalisée |
Fournisseur de configuration de variables d’environnement | Variables d'environnement |
Fournisseur de configuration de fichier | Fichiers INI, JSON et XML |
Fournisseur de configuration clé par fichier | Fichiers de répertoire |
Fournisseur de configuration de mémoire | Collections en mémoire |
Secrets utilisateur | Fichier dans le répertoire de profil utilisateur |
Les sources de configuration sont lues dans l’ordre où leurs fournisseurs de configuration sont spécifiés. Organisez les fournisseurs de configuration dans le code en fonction des priorités pour les sources de configuration sous-jacentes nécessaires pour l’application.
Une séquence type des fournisseurs de configuration est la suivante :
appsettings.json
appsettings.{Environment}.json
Une pratique courante consiste à ajouter le fournisseur de configuration de ligne de commande en dernier dans une série de fournisseurs pour permettre aux arguments de ligne de commande de remplacer la configuration définie par les autres fournisseurs.
La séquence de fournisseurs précédente est utilisée dans la configuration par défaut.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
L’API de configuration présente des règles de traitement spéciales pour quatre variables d’environnement de chaîne de connexion. Ces chaînes de connexion sont impliquées dans la configuration des chaînes de connexion Azure pour l’environnement de l’application. Les variables d’environnement avec les préfixes indiqués dans le tableau sont chargées dans l’application avec la configuration par défaut ou si aucun préfixe n’est fourni à AddEnvironmentVariables
.
Préfixe de la chaîne de connexion | Fournisseur |
---|---|
CUSTOMCONNSTR_ |
Fournisseur personnalisé |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Quand une variable d’environnement est découverte et chargée dans la configuration avec l’un des quatre préfixes indiqués dans le tableau :
ConnectionStrings
).CUSTOMCONNSTR_
, qui ne possède aucun fournisseur indiqué).Clé de variable d’environnement | Clé de configuration convertie | Entrée de configuration de fournisseur |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Entrée de configuration non créée. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
FileConfigurationProvider est la classe de base pour charger la configuration à partir du système de fichiers. Les fournisseurs de configuration suivants dérivent de FileConfigurationProvider
:
IniConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier INI lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true)
.AddIniFile($"MyIniConfig.{builder.Environment.EnvironmentName}.ini",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyIniConfig.ini
et MyIniConfig.{Environment}.ini
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyIniConfig.ini
suivant :
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
JsonConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier JSON.
Les surcharges permettent de spécifier :
Prenez le code suivant :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("MyConfig.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code précédent :
MyConfig.json
avec les options suivantes :optional: true
: le fichier est facultatif.reloadOnChange: true
: le fichier est rechargé quand des modifications sont enregistrées.MyConfig.json
. Les paramètres dans le fichier MyConfig.json
remplacent les paramètres par défaut dans les fournisseurs de configuration, notamment le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.En règle générale, vous ne souhaitez pas qu’un fichier JSON personnalisé écrase les valeurs définies dans le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.
XmlConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier XML lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true)
.AddXmlFile($"MyXMLFile.{builder.Environment.EnvironmentName}.xml",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyXMLFile.xml
et MyXMLFile.{Environment}.xml
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyXMLFile.xml
suivant :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Les éléments répétitifs qui utilisent le même nom d’élément fonctionnent si l’attribut name
est utilisé pour distinguer les éléments :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="section0">
<key name="key0">value 00</key>
<key name="key1">value 01</key>
</section>
<section name="section1">
<key name="key0">value 10</key>
<key name="key1">value 11</key>
</section>
</configuration>
Le code suivant lit le fichier de configuration précédent et affiche les clés et les valeurs :
public class IndexModel : PageModel
{
private readonly IConfiguration Configuration;
public IndexModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var key00 = "section:section0:key:key0";
var key01 = "section:section0:key:key1";
var key10 = "section:section1:key:key0";
var key11 = "section:section1:key:key1";
var val00 = Configuration[key00];
var val01 = Configuration[key01];
var val10 = Configuration[key10];
var val11 = Configuration[key11];
return Content($"{key00} value: {val00} \n" +
$"{key01} value: {val01} \n" +
$"{key10} value: {val10} \n" +
$"{key10} value: {val11} \n"
);
}
}
Les attributs peuvent être utilisés pour fournir des valeurs :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
Le fichier de configuration précédent charge les clés suivantes avec value
:
Le KeyPerFileConfigurationProvider utilise les fichiers d’un répertoire en tant que paires clé-valeur de configuration. La clé est le nom de fichier. La valeur contient le contenu du fichier. Le fournisseur de configuration Clé par fichier est utilisé dans les scénarios d’hébergement de Docker.
Pour activer la configuration clé par fichier, appelez la méthode d’extension AddKeyPerFile sur une instance de ConfigurationBuilder. Le directoryPath
aux fichiers doit être un chemin d’accès absolu.
Les surcharges permettent de spécifier :
Action<KeyPerFileConfigurationSource>
qui configure la source.Le double trait de soulignement (__
) est utilisé comme un délimiteur de clé de configuration dans les noms de fichiers. Par exemple, le nom de fichier Logging__LogLevel__System
génère la clé de configuration Logging:LogLevel:System
.
Appelez ConfigureAppConfiguration
lors de la création de l’hôte pour spécifier la configuration de l’application :
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Le MemoryConfigurationProvider utilise une collection en mémoire en tant que paires clé-valeur de configuration.
Le code suivant ajoute une collection en mémoire au système de configuration :
var builder = WebApplication.CreateBuilder(args);
var Dict = new Dictionary<string, string>
{
{"MyKey", "Dictionary MyKey Value"},
{"Position:Title", "Dictionary_Title"},
{"Position:Name", "Dictionary_Name" },
{"Logging:LogLevel:Default", "Warning"}
};
builder.Configuration.AddInMemoryCollection(Dict);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant de l’exemple de téléchargement affiche les paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Dans le code précédent, config.AddInMemoryCollection(Dict)
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.
Consultez Lier un tableau pour un autre exemple utilisant MemoryConfigurationProvider
.
Kestrel la configuration d’un point de terminaison spécifique remplace toutes les configurations de point de terminaison entre serveurs. Les configurations de point de terminaison entre serveurs comprennent notamment :
--urls
sur la ligne de commandeASPNETCORE_URLS
Examinons le fichier appsettings.json
utilisé dans une application web ASP.NET Core :
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Quand le balisage en surbrillance précédent est utilisé dans une application web ASP.NET Core et que l’application est lancée sur la ligne de commande avec la configuration de point de terminaison entre serveurs suivante :
dotnet run --urls="https://localhost:7777"
Kestrel crée une liaison vers le point de terminaison configuré spécifiquement pour Kestrel dans le fichier appsettings.json
(https://localhost:9999
) et non https://localhost:7777
.
Examinons le point de terminaison spécifique Kestrel configuré comme une variable d’environnement :
set Kestrel__Endpoints__Https__Url=https://localhost:8888
Dans la variable d’environnement précédente, Https
est le nom du point de terminaison spécifique Kestrel. Le fichier appsettings.json
précédent définit également un point de terminaison spécifique Kestrel nommé Https
. Par défaut, les variables d’environnement utilisant le fournisseur de configuration des variables d’environnement sont lues après appsettings.{Environment}.json
. Par conséquent, la variable d’environnement précédente est utilisée pour le point de terminaison Https
.
ConfigurationBinder.GetValue extrait une valeur unique de la configuration avec une clé spécifiée et la convertit selon le type spécifié :
public class TestNumModel : PageModel
{
private readonly IConfiguration Configuration;
public TestNumModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var number = Configuration.GetValue<int>("NumberKey", 99);
return Content($"{number}");
}
}
Dans le code précédent, si NumberKey
est introuvable dans la configuration, la valeur par défaut de 99
est utilisée.
Pour les exemples suivants, utilisez le fichier MySubsection.json
suivant :
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
Le code suivant ajoute MySubsection.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
IConfiguration.GetSection retourne une sous-section de la configuration avec la clé de sous-section spécifiée.
Le code suivant retourne les valeurs pour section1
:
public class TestSectionModel : PageModel
{
private readonly IConfiguration Config;
public TestSectionModel(IConfiguration configuration)
{
Config = configuration.GetSection("section1");
}
public ContentResult OnGet()
{
return Content(
$"section1:key0: '{Config["key0"]}'\n" +
$"section1:key1: '{Config["key1"]}'");
}
}
Le code suivant retourne les valeurs pour section2:subsection0
:
public class TestSection2Model : PageModel
{
private readonly IConfiguration Config;
public TestSection2Model(IConfiguration configuration)
{
Config = configuration.GetSection("section2:subsection0");
}
public ContentResult OnGet()
{
return Content(
$"section2:subsection0:key0 '{Config["key0"]}'\n" +
$"section2:subsection0:key1:'{Config["key1"]}'");
}
}
GetSection
ne retourne jamais null
. Si aucune section correspondante n’est trouvée, une valeur IConfigurationSection
vide est retournée.
Quand GetSection
retourne une section correspondante, Value n’est pas rempli. Key et Path sont retournés quand la section existe.
Le code suivant appelle IConfiguration.GetChildren et retourne les valeurs pour section2:subsection0
:
public class TestSection4Model : PageModel
{
private readonly IConfiguration Config;
public TestSection4Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
string s = "";
var selection = Config.GetSection("section2");
if (!selection.Exists())
{
throw new Exception("section2 does not exist.");
}
var children = selection.GetChildren();
foreach (var subSection in children)
{
int i = 0;
var key1 = subSection.Key + ":key" + i++.ToString();
var key2 = subSection.Key + ":key" + i.ToString();
s += key1 + " value: " + selection[key1] + "\n";
s += key2 + " value: " + selection[key2] + "\n";
}
return Content(s);
}
}
Le code précédent appelle ConfigurationExtensions.Exists pour vérifier que la section existe :
ConfigurationBinder.Bind prend en charge la liaison de tableaux à des objets à l’aide d’index de tableau dans les clés de configuration. Tout format de tableau qui expose un segment de clé numérique est capable d’effectuer la liaison de tableau avec un tableau de classes POCO.
Examinons MyArray.json
dans l’exemple de téléchargement :
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
Le code suivant ajoute MyArray.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant lit la configuration et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample? _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
if (_array == null)
{
throw new ArgumentNullException(nameof(_array));
}
string s = String.Empty;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
public class ArrayExample
{
public string[]? Entries { get; set; }
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
Dans la sortie précédente, l’index 3 a la valeur value40
, ce qui correspond à "4": "value40",
dans MyArray.json
. Les index de tableau lié sont contenus et ne sont pas liés à l’index de clé de configuration. Le binder de configuration n’est pas en mesure de lier des valeurs null, ni de créer des entrées null dans des objets liés.
L’exemple d’application montre comment créer un fournisseur de configuration de base qui lit les paires clé-valeur de configuration à partir d’une base de données à l’aide d’Entity Framework (EF).
Le fournisseur présente les caractéristiques suivantes :
ConfigurationBuilder
pour fournir la chaîne de connexion à partir d’un autre fournisseur de configuration.Définissez une entité EFConfigurationValue
pour le stockage des valeurs de configuration dans la base de données.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Ajoutez un EFConfigurationContext
pour stocker les valeurs configurées et y accéder.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Créez une classe qui implémente IConfigurationSource.
EFConfigurationProvider/EFConfigurationSource.cs
:
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction) => _optionsAction = optionsAction;
public IConfigurationProvider Build(IConfigurationBuilder builder) => new EFConfigurationProvider(_optionsAction);
}
Créez le fournisseur de configuration personnalisé en héritant de ConfigurationProvider. Le fournisseur de configuration initialise la base de données quand elle est vide. Étant donné que les clés de configuration ne respectent pas la casse, le dictionnaire utilisé pour initialiser la base de données est créé avec le comparateur ne respectant pas la casse (StringComparer.OrdinalIgnoreCase).
EFConfigurationProvider/EFConfigurationProvider.cs
:
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity-2005
var configValues =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
Une méthode d’extension AddEFConfiguration
permet d’ajouter la source de configuration à un ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
Le code suivant montre comment utiliser le EFConfigurationProvider
personnalisé dans Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
La configuration peut être injectée dans des services à l’aide de l’injection de dépendances en résolvant le service IConfiguration :
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Pour plus d’informations sur l’accès aux valeurs à l’aide de IConfiguration
, consultez GetValue et GetSection, GetChildren et Exists dans cet article.
Le code suivant affiche les données de configuration dans une page Razor :
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Dans le code suivant, MyOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
Le balisage suivant utilise la directive @inject
Razor pour résoudre et afficher les valeurs des options :
@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@using SampleApp.Models
@inject IOptions<MyOptions> optionsAccessor
<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>
Le code suivant affiche les données de configuration dans une vue MVC :
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Le code suivant accède à la configuration dans le fichier Program.cs
.
var builder = WebApplication.CreateBuilder(args);
var key1 = builder.Configuration.GetValue<string>("KeyOne");
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
var key2 = app.Configuration.GetValue<int>("KeyTwo");
var key3 = app.Configuration.GetValue<bool>("KeyThree");
app.Logger.LogInformation("KeyOne: {KeyOne}", key1);
app.Logger.LogInformation("KeyTwo: {KeyTwo}", key2);
app.Logger.LogInformation("KeyThree: {KeyThree}", key3);
app.Run();
Dans appsettings.json
pour l’exemple précédent :
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Les options configurées dans un délégué remplacent les valeurs définies dans les fournisseurs de configuration.
Dans le code suivant, un service IConfigureOptions<TOptions> est ajouté au conteneur de services. Il utilise un délégué pour configurer les valeurs pour MyOptions
:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
});
var app = builder.Build();
Le code suivant affiche les valeurs d’options :
public class Test2Model : PageModel
{
private readonly IOptions<MyOptions> _optionsDelegate;
public Test2Model(IOptions<MyOptions> optionsDelegate )
{
_optionsDelegate = optionsDelegate;
}
public ContentResult OnGet()
{
return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
$"Option2: {_optionsDelegate.Value.Option2}");
}
}
Dans l’exemple précédent, les valeurs de Option1
et Option2
sont spécifiées dans appsettings.json
, puis remplacées par le délégué configuré.
Avant que l’application ne soit configurée et démarrée, un hôte est configuré et lancé. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. L’application et l’hôte sont configurés à l’aide des fournisseurs de configuration décrits dans cette rubrique. Les paires clé-valeur de la configuration de l’hôte sont également incluses dans la configuration de l’application. Pour plus d’informations sur l’utilisation des fournisseurs de configuration lors de la génération de l’hôte et sur l’impact des sources de configuration sur la configuration de l’hôte, consultez Vue d’ensemble des notions de base d’ASP.NET Core.
Pour plus de détails sur la configuration par défaut lors de l’utilisation de l’hôte Web, consultez la version ASP.NET Core 2.2. de cette rubrique.
DOTNET_
(par exemple DOTNET_ENVIRONMENT
) avec le fournisseur de configuration des variables d’environnement. Le préfixe (DOTNET_
) est supprimé lorsque les paires clé-valeur de la configuration sont chargées.ConfigureWebHostDefaults
) : ASPNETCORE_FORWARDEDHEADERS_ENABLED
est définie sur true
.Cette rubrique se rapporte uniquement à la configuration des applications. D’autres aspects concernant l’exécution et l’hébergement des applications ASP.NET Core sont configurés à l’aide des fichiers de configuration qui ne sont pas abordés dans cette rubrique :
launch.json
/launchSettings.json
sont des fichiers de configuration d’outils pour l’environnement de développement, décrits ci-après : web.config
est un fichier de configuration de serveur décrit dans les rubriques suivantes :
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système.
Pour plus d’informations sur la migration de la configuration d’application à partir de versions antérieures d’ASP.NET, consultez Effectuer une mise à jour d’ASP.NET vers ASP.NET Core.
Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup
de l’application. Pour plus d’informations, consultez Utiliser des assemblys d’hébergement au démarrage dans ASP.NET Core.
La configuration de l’application dans ASP.NET Core est effectuée à l’aide d’un ou de plusieurs fournisseurs de configuration. Les fournisseurs de configuration lisent les données de configuration de paires clé-valeur à l’aide de diverses sources de configuration :
appsettings.json
Cet article fournit des informations sur la configuration dans ASP.NET Core. Pour plus d’informations sur l’utilisation de la configuration dans des applications de console, consultez Configuration .NET.
Les applications ASP.NET Core configurent et lancent un hôte. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. Les modèles ASP.NET Core créent un WebApplicationBuilder qui contient l’hôte. Une configuration peut être effectuée à la fois dans les fournisseurs de configuration de l’hôte et de l’application. Toutefois, seule la configuration nécessaire à l’hôte doit généralement être effectuée dans la configuration de l’hôte.
La configuration de l’application représente la priorité la plus élevée. Elle est détaillée dans la section suivante. La configuration de l’hôte suit la configuration de l’application. Elle est décrite dans cet article.
Les applications web ASP.NET Core créées avec dotnet new ou Visual Studio génèrent le code suivant :
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialise une nouvelle instance de la classe WebApplicationBuilder avec les valeurs par défaut préconfigurées. Le WebApplicationBuilder
(builder
) initialisé fournit la configuration de l’application par défaut dans l’ordre suivant, de la priorité la plus élevée à la plus basse :
Development
appsettings.{Environment}.json
avec le fournisseur de configuration JSON. Par exemple : appsettings.Production.json
et appsettings.Development.json
.La liste suivante contient les sources de configuration de l’hôte par défaut de la priorité la plus élevée à la plus basse :
ASPNETCORE_
avec le fournisseur de configuration des variables d’environnement.DOTNET_
avec le fournisseur de configuration des variables d’environnement.Quand une valeur de configuration est définie dans la configuration de l’hôte et de l’application, la configuration de l’application est utilisée.
Consultez Explication dans ce commentaire GitHub pour mieux comprendre pourquoi les variables d’environnement avec préfixe ASPNETCORE_
ont une priorité plus élevée que les arguments de ligne de commande dans la configuration de l’hôte.
Les variables suivantes sont verrouillées au début lors de l’initialisation des générateurs d’hôtes. Elles ne peuvent pas être affectées via la configuration de l’application :
Development
, Production
et Staging
Tous les autres paramètres d’hôte sont lus à partir de la configuration de l’application et non de la configuration de l’hôte.
URLS
est l’un des nombreux paramètres courants de l’hôte qui n’est pas un paramètre d’amorçage. Comme tous les autres paramètres d’hôte ne figurant pas dans la liste précédente, URLS
est lu ultérieurement à partir de la configuration de l’application. La configuration de l’hôte est une solution de secours pour la configuration de l’application. La configuration de l’hôte peut donc être utilisée pour définir URLS
, mais elle sera remplacée par toute source de configuration dans la configuration de l’application, comme appsettings.json
.
Pour plus d’informations, consultez Modifier la racine du contenu, le nom de l’application et l’environnement et Modifier la racine du contenu, le nom de l’application et l’environnement à l’aide de variables d’environnement ou de la ligne de commande
Les sections suivantes de cet article font référence à la configuration de l’application.
Le code suivant affiche les fournisseurs de configuration activés dans l’ordre dans lequel ils ont été ajoutés :
public class Index2Model : PageModel
{
private IConfigurationRoot ConfigRoot;
public Index2Model(IConfiguration configRoot)
{
ConfigRoot = (IConfigurationRoot)configRoot;
}
public ContentResult OnGet()
{
string str = "";
foreach (var provider in ConfigRoot.Providers.ToList())
{
str += provider.ToString() + "\n";
}
return Content(str);
}
}
La liste des sources de configuration par défaut classées de la priorité la plus élevée à la plus basse précédente affiche les fournisseurs dans l’ordre inverse de leur ajout à l’application générée par le modèle. Par exemple, le fournisseur de configuration JSON est ajouté avant le fournisseur de configuration de ligne de commande.
Les fournisseurs de configuration ajoutés ultérieurement ont une priorité plus élevée. Ils remplacent les paramètres de clé précédents. Par exemple, si MyKey
est défini dans appsettings.json
et dans l’environnement, la valeur d’environnement est utilisée. À l’aide des fournisseurs de configuration par défaut, le fournisseur de configuration de ligne de commande remplace les valeurs de tous les autres fournisseurs.
Pour plus d’informations sur CreateBuilder
, consultez Paramètres du générateur par défaut.
Examinons le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Le JsonConfigurationProvider par défaut charge la configuration dans l’ordre suivant :
appsettings.json
appsettings.{Environment}.json
: par exemple les fichiers appsettings.Production.json
et appsettings.Development.json
. La version de l’environnement du fichier est chargée en fonction de IHostingEnvironment.EnvironmentName. Pour plus d’informations, consultez Utiliser plusieurs environnements dans ASP.NET Core.Les valeurs appsettings.{Environment}.json
remplacent les clés dans appsettings.json
. Par exemple, par défaut :
appsettings.Development.json
remplace les valeurs trouvées dans appsettings.json
.appsettings.Production.json
remplace les valeurs trouvées dans appsettings.json
. Par exemple, lors du déploiement de l’application sur Azure.Si une valeur de configuration doit être garantie, consultez GetValue. L’exemple précédent lit uniquement les chaînes. Il ne prend pas en charge de valeur par défaut.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
La meilleure méthode pour lire les valeurs de configuration associées consiste à utiliser le modèle d’options. Par exemple, pour lire les valeurs de configuration suivantes :
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Créez la classe PositionOptions
suivante :
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Classe d’options :
Position
n’est pas lié. Le champ Position
est utilisé pour qu’il ne soit pas nécessaire de coder la chaîne "Position"
en dur dans l’application lors de la liaison de la classe à un fournisseur de configuration.Le code suivant :
PositionOptions
à la section Position
.Position
.public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
ConfigurationBinder.Get<T>
lie et retourne le type spécifié. Il peut être plus pratique d’utiliser ConfigurationBinder.Get<T>
que ConfigurationBinder.Bind
. Le code suivant illustre la classe ConfigurationBinder.Get<T>
avec la classe PositionOptions
:
public class Test21Model : PageModel
{
private readonly IConfiguration Configuration;
public PositionOptions? positionOptions { get; private set; }
public Test21Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
Dans le code précédent, par défaut, les modifications apportées au fichier de configuration JSON après le démarrage de l’application sont lues.
Une autre approche lors de l’utilisation du modèle d’options consiste à lier la section Position
et à l’ajouter au conteneur de service d’injection de dépendances. Dans le code suivant, PositionOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
À l’aide du code précédent, le code suivant lit les options de position :
public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
Dans le code précédent, les modifications apportées au fichier de configuration JSON après le démarrage de l’application ne sont pas lues. Pour lire les modifications après que l’application a démarré, utilisez IOptionsSnapshot.
À l’aide de la configuration par défaut , les fichiers appsettings.json
et appsettings.{Environment}.json
sont activés avec reloadOnChange: true. Les modifications apportées aux fichiers appsettings.json
et appsettings.{Environment}.json
après le démarrage de l’application sont lues par le fournisseur de configuration JSON.
Consultez Fournisseur de configuration JSON dans ce document pour plus d’informations sur l’ajout de fichiers de configuration JSON.
Examinons les éléments suivants permettant d’inscrire les services et de configurer les options :
using ConfigSample.Options;
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
builder.Services.Configure<ColorOptions>(
builder.Configuration.GetSection(ColorOptions.Color));
builder.Services.AddScoped<IMyDependency, MyDependency>();
builder.Services.AddScoped<IMyDependency2, MyDependency2>();
var app = builder.Build();
Les groupes d’inscriptions associés peuvent être déplacés vers une méthode d’extension pour inscrire les services. Les services de configuration sont par exemple ajoutés à la classe suivante :
using ConfigSample.Options;
using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.DependencyInjection
{
public static class MyConfigServiceCollectionExtensions
{
public static IServiceCollection AddConfig(
this IServiceCollection services, IConfiguration config)
{
services.Configure<PositionOptions>(
config.GetSection(PositionOptions.Position));
services.Configure<ColorOptions>(
config.GetSection(ColorOptions.Color));
return services;
}
public static IServiceCollection AddMyDependencyGroup(
this IServiceCollection services)
{
services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<IMyDependency2, MyDependency2>();
return services;
}
}
}
Les services qui restent sont inscrits dans une classe similaire. Le code suivant utilise les nouvelles méthodes d’extension pour inscrire les services :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Remarque : chaque méthode d’extension services.Add{GROUP_NAME}
ajoute des services et les configure éventuellement. Par exemple, AddControllersWithViews ajoute les services nécessaires à MVC avec vues et AddRazorPages ajoute les services nécessaires aux pages Razor.
Instructions relatives aux données de configuration :
Par défaut, la source de configuration des secrets de l’utilisateur est inscrite après les sources de configuration JSON. Par conséquent, les clés des secrets utilisateur sont prioritaires sur les clés dans appsettings.json
et appsettings.{Environment}.json
.
Pour plus d’informations sur le stockage des mots de passe ou d’autres données sensibles :
Azure Key Vault stocke en toute sécurité des secrets d’application pour les applications ASP.NET Core. Pour plus d’informations, consultez Fournisseur de configuration Azure Key Vault dans ASP.NET Core.
Les variables d’environnement sans préfixe sont des variables d’environnement autres que celles avec le préfixe ASPNETCORE_
ou DOTNET_
. Par exemple, l’ensemble de modèles d’application web ASP.NET Core "ASPNETCORE_ENVIRONMENT": "Development"
dans launchSettings.json
. Pour plus d’informations sur les variables d’environnement ASPNETCORE_
et DOTNET_
, consultez :
ASPNETCORE_
et avec le préfixe DOTNETCORE_
.DOTNET_
variables d’environnement utilisées en dehors de Microsoft.Extensions.Hosting.À l’aide de la configuration par défaut, EnvironmentVariablesConfigurationProvider charge la configuration à partir de paires clé-valeur d’environnement après avoir lu appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur. Par conséquent, les valeurs de clés lues à partir de l’environnement remplacent les valeurs lues à partir de appsettings.json
, appsettings.{Environment}.json
et les secrets de l’utilisateur.
Le séparateur :
ne fonctionne pas avec les clés hiérarchiques des variables d’environnement sur toutes les plateformes. Par exemple, le séparateur :
n’est pas pris en charge par Bash. Le double trait de soulignement __
est :
:
.Les commandes suivantes set
permettent de :
dotnet run
doit être exécutée dans le répertoire du projet.set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
Paramètres d’environnement précédents :
Les commandes setx suivantes peuvent être utilisées pour définir les clés et les valeurs d’environnement sur Windows. Contrairement à set
, les paramètres setx
sont persistants. /M
définit la variable dans l’environnement système. Si le commutateur /M
n’est pas utilisé, une variable d’environnement utilisateur est définie.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Pour vérifier que les commandes précédentes remplacent appsettings.json
et appsettings.{Environment}.json
:
dotnet run
.Appelez AddEnvironmentVariables avec une chaîne pour spécifier un préfixe pour les variables d’environnement :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
Dans le code précédent :
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.MyCustomPrefix_
remplacent les fournisseurs de configuration par défaut. Il s’agit notamment des variables d’environnement sans le préfixe.Le préfixe est supprimé quand les paires clé-valeur de la configuration sont lues.
Les commandes suivantes testent le préfixe personnalisé :
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
La configuration par défaut charge les variables d’environnement et les arguments de ligne de commande précédés du préfixe DOTNET_
et ASPNETCORE_
. Les préfixes DOTNET_
et ASPNETCORE_
sont utilisés par ASP.NET Core pour la configuration de l’hôte et de l’application, mais pas pour la configuration de l’utilisateur. Pour plus d’informations sur la configuration de l’hôte et de l’application, consultez Hôte générique .NET.
Dans Azure App Service, sélectionnez Nouveau paramètre d’application dans la page Paramètres > Configuration. Les paramètres d’application Azure App Service sont :
Pour plus d’informations, consultez Azure Apps : remplacer la configuration de l’application à l’aide du portail Azure.
Consultez Préfixes des chaînes de connexion pour plus d’informations sur les chaînes de connexion de base de données Azure.
Les noms de variable d’environnement reflètent la structure d’un fichier appsettings.json
. Chaque élément de la hiérarchie est séparé par un trait de soulignement double (solution préférable) ou par deux-points. Quand la structure de l’élément comprend un tableau, l’index du tableau doit être traité comme un nom d’élément supplémentaire dans ce chemin d’accès. Examinons le fichier appsettings.json
suivant et les valeurs équivalentes représentées sous forme de variables d’environnement.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Variables d’environnement
setx SmtpServer smtp.example.com
setx Logging__0__Name ToEmail
setx Logging__0__Level Critical
setx Logging__0__Args__FromAddress MySystem@example.com
setx Logging__0__Args__ToAddress SRE@example.com
setx Logging__1__Name ToConsole
setx Logging__1__Level Information
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système. Par exemple, les modèles web ASP.NET Core génèrent un fichier launchSettings.json
qui définit la configuration du point de terminaison sur :
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Configurer applicationUrl
permet de définir la variable d’environnement ASPNETCORE_URLS
et de remplacer les valeurs définies dans l’environnement.
Sur Linux, la valeur des variables d’environnement d’URL doit être placée dans une séquence d’échappement pour que systemd
puisse l’analyser. Utiliser l’outil Linux systemd-escape
qui interrompt http:--localhost:5001
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Le code suivant affiche les variables d’environnement et les valeurs au démarrage de l’application, ce qui peut être utile lors du débogage des paramètres d’environnement :
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
À l’aide de la configuration par défaut, CommandLineConfigurationProvider charge la configuration à partir de paires clé-valeur d’argument de ligne de commande après les sources de configuration suivantes :
appsettings.json
et appsettings.{Environment}.json
.Par défaut, les valeurs de configuration définies sur la ligne de commande remplacent les valeurs de configuration définies avec tous les autres fournisseurs de configuration.
La commande suivante définit des clés et des valeurs à l’aide de =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
La commande suivante définit des clés et des valeurs à l’aide de --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
Valeur de clé :
=
ou la clé doit avoir un préfixe --
ou /
quand la valeur suit un espace.=
est utilisée. Par exemple, MySetting=
Dans la même commande, ne mélangez pas des paires clé-valeur de l’argument de ligne de commande qui utilisent =
avec des paires clé-valeur qui utilisent un espace.
Les correspondances de commutateur permettent une logique de remplacement des noms de clé. Fournit un dictionnaire des remplacements de commutateur à la méthode AddCommandLine.
Quand le dictionnaire de correspondances de commutateur est utilisé, il est vérifié afin de déterminer s’il contient une clé correspondant à celle fournie par un argument de ligne de commande. Si la clé de ligne de commande est trouvée dans le dictionnaire, la valeur du dictionnaire est retournée pour définir la paire clé-valeur dans la configuration de l’application. Une correspondance de commutateur est nécessaire pour chaque clé de ligne de commande préfixée avec un tiret unique (-
).
Règles des clés du dictionnaire de correspondances de commutateur :
-
ou --
.Pour utiliser un dictionnaire de correspondances de commutateur, transmettez-le dans l’appel à AddCommandLine
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var switchMappings = new Dictionary<string, string>()
{
{ "-k1", "key1" },
{ "-k2", "key2" },
{ "--alt3", "key3" },
{ "--alt4", "key4" },
{ "--alt5", "key5" },
{ "--alt6", "key6" },
};
builder.Configuration.AddCommandLine(args, switchMappings);
var app = builder.Build();
Exécutez la commande suivante pour tester le remplacement de la clé :
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
Le code suivant montre les valeurs de clé pour les clés remplacées :
public class Test3Model : PageModel
{
private readonly IConfiguration Config;
public Test3Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
return Content(
$"Key1: '{Config["Key1"]}'\n" +
$"Key2: '{Config["Key2"]}'\n" +
$"Key3: '{Config["Key3"]}'\n" +
$"Key4: '{Config["Key4"]}'\n" +
$"Key5: '{Config["Key5"]}'\n" +
$"Key6: '{Config["Key6"]}'");
}
}
Pour les applications qui utilisent des mappages de commutateurs, l’appel à CreateDefaultBuilder
ne doit pas passer d’arguments. L’appel AddCommandLine
de la méthode CreateDefaultBuilder
n’inclut pas de commutateurs mappés. Il n’existe aucun moyen de transmettre le dictionnaire de mappage de commutateur à CreateDefaultBuilder
. La solution ne consiste pas à transmettre les arguments à CreateDefaultBuilder
, mais à permettre à la méthode AddCommandLine
de la méthode ConfigurationBuilder
de traiter à la fois les arguments et le dictionnaire de correspondance de commutateur.
Les arguments d’environnement et de ligne de commande peuvent être définis dans Visual Studio à partir de la boîte de dialogue Profils de lancement :
L’API de configuration lit les données de configuration hiérarchiques en aplanissant les données hiérarchiques à l’aide d’un délimiteur dans les clés de configuration.
L’exemple de téléchargement contient le fichier appsettings.json
suivant :
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
La meilleure méthode pour lire les données de configuration hiérarchiques consiste à utiliser le modèle d’options. Pour plus d’informations, consultez Lier des données de configuration hiérarchiques à l’aide du modèle d’options dans ce document.
Les méthodes GetSection et GetChildren sont disponibles pour isoler les sections et les enfants d’une section dans les données de configuration. Ces méthodes sont décrites plus loin dans GetSection, GetChildren et Exists.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
Clés de configuration :
ConnectionString
et connectionstring
sont traités en tant que clés équivalentes.:
) fonctionne sur toutes les plateformes.__
est pris en charge par toutes les plateformes. Il est automatiquement transformé en signe deux-points :
.--
comme séparateur. Le fournisseur de configuration Azure Key Vault remplace automatiquement --
par :
quand les secrets sont chargés dans la configuration de l’application.Valeurs de configuration :
Le tableau suivant présente les fournisseurs de configuration disponibles pour les applications ASP.NET Core.
Fournisseur | Fournit la configuration à partir de |
---|---|
Fournisseur de configuration Azure Key Vault | Azure Key Vault |
Fournisseur de configuration Azure App | Azure App Configuration |
Fournisseur de configuration de ligne de commande | Paramètres de ligne de commande |
Fournisseur de configuration personnalisé | Source personnalisée |
Fournisseur de configuration de variables d’environnement | Variables d'environnement |
Fournisseur de configuration de fichier | Fichiers INI, JSON et XML |
Fournisseur de configuration clé par fichier | Fichiers de répertoire |
Fournisseur de configuration de mémoire | Collections en mémoire |
Secrets utilisateur | Fichier dans le répertoire de profil utilisateur |
Les sources de configuration sont lues dans l’ordre où leurs fournisseurs de configuration sont spécifiés. Organisez les fournisseurs de configuration dans le code en fonction des priorités pour les sources de configuration sous-jacentes nécessaires pour l’application.
Une séquence type des fournisseurs de configuration est la suivante :
appsettings.json
appsettings.{Environment}.json
Une pratique courante consiste à ajouter le fournisseur de configuration de ligne de commande en dernier dans une série de fournisseurs pour permettre aux arguments de ligne de commande de remplacer la configuration définie par les autres fournisseurs.
La séquence de fournisseurs précédente est utilisée dans la configuration par défaut.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
L’API de configuration présente des règles de traitement spéciales pour quatre variables d’environnement de chaîne de connexion. Ces chaînes de connexion sont impliquées dans la configuration des chaînes de connexion Azure pour l’environnement de l’application. Les variables d’environnement avec les préfixes indiqués dans le tableau sont chargées dans l’application avec la configuration par défaut ou si aucun préfixe n’est fourni à AddEnvironmentVariables
.
Préfixe de la chaîne de connexion | Fournisseur |
---|---|
CUSTOMCONNSTR_ |
Fournisseur personnalisé |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Quand une variable d’environnement est découverte et chargée dans la configuration avec l’un des quatre préfixes indiqués dans le tableau :
ConnectionStrings
).CUSTOMCONNSTR_
, qui ne possède aucun fournisseur indiqué).Clé de variable d’environnement | Clé de configuration convertie | Entrée de configuration de fournisseur |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Entrée de configuration non créée. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Clé : ConnectionStrings:{KEY}_ProviderName :Valeur: System.Data.SqlClient |
FileConfigurationProvider est la classe de base pour charger la configuration à partir du système de fichiers. Les fournisseurs de configuration suivants dérivent de FileConfigurationProvider
:
IniConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier INI lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true)
.AddIniFile($"MyIniConfig.{builder.Environment.EnvironmentName}.ini",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyIniConfig.ini
et MyIniConfig.{Environment}.ini
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyIniConfig.ini
suivant :
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
JsonConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier JSON.
Les surcharges permettent de spécifier :
Prenez le code suivant :
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("MyConfig.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code précédent :
MyConfig.json
avec les options suivantes :optional: true
: le fichier est facultatif.reloadOnChange: true
: le fichier est rechargé quand des modifications sont enregistrées.MyConfig.json
. Les paramètres dans le fichier MyConfig.json
remplacent les paramètres par défaut dans les fournisseurs de configuration, notamment le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.En règle générale, vous ne souhaitez pas qu’un fichier JSON personnalisé écrase les valeurs définies dans le fournisseur de configuration des variables d’environnement et le fournisseur de configuration de ligne de commande.
XmlConfigurationProvider charge la configuration à partir des paires clé-valeur du fichier XML lors de l’exécution.
Le code suivant ajoute plusieurs fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true)
.AddXmlFile($"MyXMLFile.{builder.Environment.EnvironmentName}.xml",
optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Dans le code précédent, les paramètres des fichiers MyXMLFile.xml
et MyXMLFile.{Environment}.xml
sont remplacés par les paramètres dans :
L’exemple de téléchargement contient le fichier MyXMLFile.xml
suivant :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
Le code suivant de l’exemple de téléchargement affiche certains des paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Les éléments répétitifs qui utilisent le même nom d’élément fonctionnent si l’attribut name
est utilisé pour distinguer les éléments :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="section0">
<key name="key0">value 00</key>
<key name="key1">value 01</key>
</section>
<section name="section1">
<key name="key0">value 10</key>
<key name="key1">value 11</key>
</section>
</configuration>
Le code suivant lit le fichier de configuration précédent et affiche les clés et les valeurs :
public class IndexModel : PageModel
{
private readonly IConfiguration Configuration;
public IndexModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var key00 = "section:section0:key:key0";
var key01 = "section:section0:key:key1";
var key10 = "section:section1:key:key0";
var key11 = "section:section1:key:key1";
var val00 = Configuration[key00];
var val01 = Configuration[key01];
var val10 = Configuration[key10];
var val11 = Configuration[key11];
return Content($"{key00} value: {val00} \n" +
$"{key01} value: {val01} \n" +
$"{key10} value: {val10} \n" +
$"{key10} value: {val11} \n"
);
}
}
Les attributs peuvent être utilisés pour fournir des valeurs :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
Le fichier de configuration précédent charge les clés suivantes avec value
:
Le KeyPerFileConfigurationProvider utilise les fichiers d’un répertoire en tant que paires clé-valeur de configuration. La clé est le nom de fichier. La valeur contient le contenu du fichier. Le fournisseur de configuration Clé par fichier est utilisé dans les scénarios d’hébergement de Docker.
Pour activer la configuration clé par fichier, appelez la méthode d’extension AddKeyPerFile sur une instance de ConfigurationBuilder. Le directoryPath
aux fichiers doit être un chemin d’accès absolu.
Les surcharges permettent de spécifier :
Action<KeyPerFileConfigurationSource>
qui configure la source.Le double trait de soulignement (__
) est utilisé comme un délimiteur de clé de configuration dans les noms de fichiers. Par exemple, le nom de fichier Logging__LogLevel__System
génère la clé de configuration Logging:LogLevel:System
.
Appelez ConfigureAppConfiguration
lors de la création de l’hôte pour spécifier la configuration de l’application :
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Le MemoryConfigurationProvider utilise une collection en mémoire en tant que paires clé-valeur de configuration.
Le code suivant ajoute une collection en mémoire au système de configuration :
var builder = WebApplication.CreateBuilder(args);
var Dict = new Dictionary<string, string>
{
{"MyKey", "Dictionary MyKey Value"},
{"Position:Title", "Dictionary_Title"},
{"Position:Name", "Dictionary_Name" },
{"Logging:LogLevel:Default", "Warning"}
};
builder.Configuration.AddInMemoryCollection(Dict);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant de l’exemple de téléchargement affiche les paramètres de configuration précédents :
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}
Dans le code précédent, config.AddInMemoryCollection(Dict)
est ajouté après les fournisseurs de configuration par défaut. Pour obtenir un exemple de classement des fournisseurs de configuration, consultez Fournisseur de configuration JSON.
Consultez Lier un tableau pour un autre exemple utilisant MemoryConfigurationProvider
.
Kestrel la configuration d’un point de terminaison spécifique remplace toutes les configurations de point de terminaison entre serveurs. Les configurations de point de terminaison entre serveurs comprennent notamment :
--urls
sur la ligne de commandeASPNETCORE_URLS
Examinons le fichier appsettings.json
utilisé dans une application web ASP.NET Core :
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Quand le balisage en surbrillance précédent est utilisé dans une application web ASP.NET Core et que l’application est lancée sur la ligne de commande avec la configuration de point de terminaison entre serveurs suivante :
dotnet run --urls="https://localhost:7777"
Kestrel crée une liaison vers le point de terminaison configuré spécifiquement pour Kestrel dans le fichier appsettings.json
(https://localhost:9999
) et non https://localhost:7777
.
Examinons le point de terminaison spécifique Kestrel configuré comme une variable d’environnement :
set Kestrel__Endpoints__Https__Url=https://localhost:8888
Dans la variable d’environnement précédente, Https
est le nom du point de terminaison spécifique Kestrel. Le fichier appsettings.json
précédent définit également un point de terminaison spécifique Kestrel nommé Https
. Par défaut, les variables d’environnement utilisant le fournisseur de configuration des variables d’environnement sont lues après appsettings.{Environment}.json
. Par conséquent, la variable d’environnement précédente est utilisée pour le point de terminaison Https
.
ConfigurationBinder.GetValue extrait une valeur unique de la configuration avec une clé spécifiée et la convertit selon le type spécifié :
public class TestNumModel : PageModel
{
private readonly IConfiguration Configuration;
public TestNumModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var number = Configuration.GetValue<int>("NumberKey", 99);
return Content($"{number}");
}
}
Dans le code précédent, si NumberKey
est introuvable dans la configuration, la valeur par défaut de 99
est utilisée.
Pour les exemples suivants, utilisez le fichier MySubsection.json
suivant :
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
Le code suivant ajoute MySubsection.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
IConfiguration.GetSection retourne une sous-section de la configuration avec la clé de sous-section spécifiée.
Le code suivant retourne les valeurs pour section1
:
public class TestSectionModel : PageModel
{
private readonly IConfiguration Config;
public TestSectionModel(IConfiguration configuration)
{
Config = configuration.GetSection("section1");
}
public ContentResult OnGet()
{
return Content(
$"section1:key0: '{Config["key0"]}'\n" +
$"section1:key1: '{Config["key1"]}'");
}
}
Le code suivant retourne les valeurs pour section2:subsection0
:
public class TestSection2Model : PageModel
{
private readonly IConfiguration Config;
public TestSection2Model(IConfiguration configuration)
{
Config = configuration.GetSection("section2:subsection0");
}
public ContentResult OnGet()
{
return Content(
$"section2:subsection0:key0 '{Config["key0"]}'\n" +
$"section2:subsection0:key1:'{Config["key1"]}'");
}
}
GetSection
ne retourne jamais null
. Si aucune section correspondante n’est trouvée, une valeur IConfigurationSection
vide est retournée.
Quand GetSection
retourne une section correspondante, Value n’est pas rempli. Key et Path sont retournés quand la section existe.
Le code suivant appelle IConfiguration.GetChildren et retourne les valeurs pour section2:subsection0
:
public class TestSection4Model : PageModel
{
private readonly IConfiguration Config;
public TestSection4Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
string s = "";
var selection = Config.GetSection("section2");
if (!selection.Exists())
{
throw new Exception("section2 does not exist.");
}
var children = selection.GetChildren();
foreach (var subSection in children)
{
int i = 0;
var key1 = subSection.Key + ":key" + i++.ToString();
var key2 = subSection.Key + ":key" + i.ToString();
s += key1 + " value: " + selection[key1] + "\n";
s += key2 + " value: " + selection[key2] + "\n";
}
return Content(s);
}
}
Le code précédent appelle ConfigurationExtensions.Exists pour vérifier que la section existe :
ConfigurationBinder.Bind prend en charge la liaison de tableaux à des objets à l’aide d’index de tableau dans les clés de configuration. Tout format de tableau qui expose un segment de clé numérique est capable d’effectuer la liaison de tableau avec un tableau de classes POCO.
Examinons MyArray.json
dans l’exemple de téléchargement :
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
Le code suivant ajoute MyArray.json
aux fournisseurs de configuration :
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Le code suivant lit la configuration et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample? _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
if (_array == null)
{
throw new ArgumentNullException(nameof(_array));
}
string s = String.Empty;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
public class ArrayExample
{
public string[]? Entries { get; set; }
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
Dans la sortie précédente, l’index 3 a la valeur value40
, ce qui correspond à "4": "value40",
dans MyArray.json
. Les index de tableau lié sont contenus et ne sont pas liés à l’index de clé de configuration. Le binder de configuration n’est pas en mesure de lier des valeurs null, ni de créer des entrées null dans des objets liés.
L’exemple d’application montre comment créer un fournisseur de configuration de base qui lit les paires clé-valeur de configuration à partir d’une base de données à l’aide d’Entity Framework (EF).
Le fournisseur présente les caractéristiques suivantes :
ConfigurationBuilder
pour fournir la chaîne de connexion à partir d’un autre fournisseur de configuration.Définissez une entité EFConfigurationValue
pour le stockage des valeurs de configuration dans la base de données.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Ajoutez un EFConfigurationContext
pour stocker les valeurs configurées et y accéder.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Créez une classe qui implémente IConfigurationSource.
EFConfigurationProvider/EFConfigurationSource.cs
:
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction) => _optionsAction = optionsAction;
public IConfigurationProvider Build(IConfigurationBuilder builder) => new EFConfigurationProvider(_optionsAction);
}
Créez le fournisseur de configuration personnalisé en héritant de ConfigurationProvider. Le fournisseur de configuration initialise la base de données quand elle est vide. Étant donné que les clés de configuration ne respectent pas la casse, le dictionnaire utilisé pour initialiser la base de données est créé avec le comparateur ne respectant pas la casse (StringComparer.OrdinalIgnoreCase).
EFConfigurationProvider/EFConfigurationProvider.cs
:
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity-2005
var configValues =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
if (dbContext == null || dbContext.Values == null)
{
throw new Exception("Null DB context");
}
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
Une méthode d’extension AddEFConfiguration
permet d’ajouter la source de configuration à un ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
Le code suivant montre comment utiliser le EFConfigurationProvider
personnalisé dans Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
La configuration peut être injectée dans des services à l’aide de l’injection de dépendances en résolvant le service IConfiguration :
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Pour plus d’informations sur l’accès aux valeurs à l’aide de IConfiguration
, consultez GetValue et GetSection, GetChildren et Exists dans cet article.
Le code suivant affiche les données de configuration dans une page Razor :
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Dans le code suivant, MyOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
Le balisage suivant utilise la directive @inject
Razor pour résoudre et afficher les valeurs des options :
@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@using SampleApp.Models
@inject IOptions<MyOptions> optionsAccessor
<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>
Le code suivant affiche les données de configuration dans une vue MVC :
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Le code suivant accède à la configuration dans le fichier Program.cs
.
var builder = WebApplication.CreateBuilder(args);
var key1 = builder.Configuration.GetValue<string>("KeyOne");
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
var key2 = app.Configuration.GetValue<int>("KeyTwo");
var key3 = app.Configuration.GetValue<bool>("KeyThree");
app.Logger.LogInformation("KeyOne: {KeyOne}", key1);
app.Logger.LogInformation("KeyTwo: {KeyTwo}", key2);
app.Logger.LogInformation("KeyThree: {KeyThree}", key3);
app.Run();
Dans appsettings.json
pour l’exemple précédent :
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Les options configurées dans un délégué remplacent les valeurs définies dans les fournisseurs de configuration.
Dans le code suivant, un service IConfigureOptions<TOptions> est ajouté au conteneur de services. Il utilise un délégué pour configurer les valeurs pour MyOptions
:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
});
var app = builder.Build();
Le code suivant affiche les valeurs d’options :
public class Test2Model : PageModel
{
private readonly IOptions<MyOptions> _optionsDelegate;
public Test2Model(IOptions<MyOptions> optionsDelegate )
{
_optionsDelegate = optionsDelegate;
}
public ContentResult OnGet()
{
return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
$"Option2: {_optionsDelegate.Value.Option2}");
}
}
Dans l’exemple précédent, les valeurs de Option1
et Option2
sont spécifiées dans appsettings.json
, puis remplacées par le délégué configuré.
Avant que l’application ne soit configurée et démarrée, un hôte est configuré et lancé. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. L’application et l’hôte sont configurés à l’aide des fournisseurs de configuration décrits dans cette rubrique. Les paires clé-valeur de la configuration de l’hôte sont également incluses dans la configuration de l’application. Pour plus d’informations sur l’utilisation des fournisseurs de configuration lors de la génération de l’hôte et sur l’impact des sources de configuration sur la configuration de l’hôte, consultez Vue d’ensemble des notions de base d’ASP.NET Core.
Pour plus de détails sur la configuration par défaut lors de l’utilisation de l’hôte Web, consultez la version ASP.NET Core 2.2. de cette rubrique.
DOTNET_
(par exemple DOTNET_ENVIRONMENT
) avec le fournisseur de configuration des variables d’environnement. Le préfixe (DOTNET_
) est supprimé lorsque les paires clé-valeur de la configuration sont chargées.ConfigureWebHostDefaults
) : ASPNETCORE_FORWARDEDHEADERS_ENABLED
est définie sur true
.Cette rubrique se rapporte uniquement à la configuration des applications. D’autres aspects concernant l’exécution et l’hébergement des applications ASP.NET Core sont configurés à l’aide des fichiers de configuration qui ne sont pas abordés dans cette rubrique :
launch.json
/launchSettings.json
sont des fichiers de configuration d’outils pour l’environnement de développement, décrits ci-après : web.config
est un fichier de configuration de serveur décrit dans les rubriques suivantes :
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système.
Pour plus d’informations sur la migration de la configuration d’application à partir de versions antérieures d’ASP.NET, consultez Effectuer une mise à jour d’ASP.NET vers ASP.NET Core.
Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup
de l’application. Pour plus d’informations, consultez Utiliser des assemblys d’hébergement au démarrage dans ASP.NET Core.
Kestrel la configuration d’un point de terminaison spécifique remplace toutes les configurations de point de terminaison entre serveurs. Les configurations de point de terminaison entre serveurs comprennent notamment :
--urls
sur la ligne de commandeASPNETCORE_URLS
Examinons le fichier appsettings.json
utilisé dans une application web ASP.NET Core :
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Quand le balisage en surbrillance précédent est utilisé dans une application web ASP.NET Core et que l’application est lancée sur la ligne de commande avec la configuration de point de terminaison entre serveurs suivante :
dotnet run --urls="https://localhost:7777"
Kestrel crée une liaison vers le point de terminaison configuré spécifiquement pour Kestrel dans le fichier appsettings.json
(https://localhost:9999
) et non https://localhost:7777
.
Examinons le point de terminaison spécifique Kestrel configuré comme une variable d’environnement :
set Kestrel__Endpoints__Https__Url=https://localhost:8888
Dans la variable d’environnement précédente, Https
est le nom du point de terminaison spécifique Kestrel. Le fichier appsettings.json
précédent définit également un point de terminaison spécifique Kestrel nommé Https
. Par défaut, les variables d’environnement utilisant le fournisseur de configuration des variables d’environnement sont lues après appsettings.{Environment}.json
. Par conséquent, la variable d’environnement précédente est utilisée pour le point de terminaison Https
.
ConfigurationBinder.GetValue extrait une valeur unique de la configuration avec une clé spécifiée et la convertit selon le type spécifié. La méthode est une méthode d’extension pour IConfiguration :
public class TestNumModel : PageModel
{
private readonly IConfiguration Configuration;
public TestNumModel(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var number = Configuration.GetValue<int>("NumberKey", 99);
return Content($"{number}");
}
}
Dans le code précédent, si NumberKey
est introuvable dans la configuration, la valeur par défaut de 99
est utilisée.
Pour les exemples suivants, utilisez le fichier MySubsection.json
suivant :
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
Le code suivant ajoute MySubsection.json
aux fournisseurs de configuration :
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
IConfiguration.GetSection retourne une sous-section de la configuration avec la clé de sous-section spécifiée.
Le code suivant retourne les valeurs pour section1
:
public class TestSectionModel : PageModel
{
private readonly IConfiguration Config;
public TestSectionModel(IConfiguration configuration)
{
Config = configuration.GetSection("section1");
}
public ContentResult OnGet()
{
return Content(
$"section1:key0: '{Config["key0"]}'\n" +
$"section1:key1: '{Config["key1"]}'");
}
}
Le code suivant retourne les valeurs pour section2:subsection0
:
public class TestSection2Model : PageModel
{
private readonly IConfiguration Config;
public TestSection2Model(IConfiguration configuration)
{
Config = configuration.GetSection("section2:subsection0");
}
public ContentResult OnGet()
{
return Content(
$"section2:subsection0:key0 '{Config["key0"]}'\n" +
$"section2:subsection0:key1:'{Config["key1"]}'");
}
}
GetSection
ne retourne jamais null
. Si aucune section correspondante n’est trouvée, une valeur IConfigurationSection
vide est retournée.
Quand GetSection
retourne une section correspondante, Value n’est pas rempli. Key et Path sont retournés quand la section existe.
Le code suivant appelle IConfiguration.GetChildren et retourne les valeurs pour section2:subsection0
:
public class TestSection4Model : PageModel
{
private readonly IConfiguration Config;
public TestSection4Model(IConfiguration configuration)
{
Config = configuration;
}
public ContentResult OnGet()
{
string s = null;
var selection = Config.GetSection("section2");
if (!selection.Exists())
{
throw new System.Exception("section2 does not exist.");
}
var children = selection.GetChildren();
foreach (var subSection in children)
{
int i = 0;
var key1 = subSection.Key + ":key" + i++.ToString();
var key2 = subSection.Key + ":key" + i.ToString();
s += key1 + " value: " + selection[key1] + "\n";
s += key2 + " value: " + selection[key2] + "\n";
}
return Content(s);
}
}
Le code précédent appelle ConfigurationExtensions.Exists pour vérifier que la section existe :
ConfigurationBinder.Bind prend en charge la liaison de tableaux à des objets à l’aide d’index de tableau dans les clés de configuration. Tout format de tableau qui expose un segment de clé numérique est capable d’effectuer la liaison de tableau avec un tableau de classes POCO.
Examinons MyArray.json
dans l’exemple de téléchargement :
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
Le code suivant ajoute MyArray.json
aux fournisseurs de configuration :
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Le code suivant lit la configuration et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
string s = null;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
Dans la sortie précédente, l’index 3 a la valeur value40
, ce qui correspond à "4": "value40",
dans MyArray.json
. Les index de tableau lié sont contenus et ne sont pas liés à l’index de clé de configuration. Le Binder de configuration n’est pas en mesure de lier des valeurs null ni de créer des entrées null dans des objets liés
Le code suivant charge la configuration array:entries
avec la méthode d’extension AddInMemoryCollection :
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
// 3 Skipped
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddInMemoryCollection(arrayDict);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Le code suivant lit la configuration dans le Dictionary
arrayDict
et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
string s = null;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value0
Index: 1 Value: value1
Index: 2 Value: value2
Index: 3 Value: value4
Index: 4 Value: value5
L’index 3 dans l’objet lié contient les données de configuration pour la clé de configuration array:4
et sa valeur value4
. Quand des données de configuration contenant un tableau sont liées, les index de tableau dans les clés de configuration sont utilisés pour itérer les données de configuration lors de la création de l’objet. Une valeur null ne peut pas être conservée dans des données de configuration, et une entrée à valeur null n’est pas créée dans un objet lié quand un tableau dans des clés de configuration ignore un ou plusieurs index.
L’élément de configuration manquant pour l’index 3 peut être fourni avant la liaison à l’instance ArrayExample
par n’importe quel fournisseur de configuration qui lit la paire clé/valeur de l’index 3. Examinons le fichier Value3.json
suivant de l’exemple de téléchargement :
{
"array:entries:3": "value3"
}
Le code suivant inclut la configuration pour Value3.json
et arrayDict
Dictionary
:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
// 3 Skipped
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddInMemoryCollection(arrayDict);
config.AddJsonFile("Value3.json",
optional: false, reloadOnChange: false);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Le code suivant lit la configuration précédente et affiche les valeurs :
public class ArrayModel : PageModel
{
private readonly IConfiguration Config;
public ArrayExample _array { get; private set; }
public ArrayModel(IConfiguration config)
{
Config = config;
}
public ContentResult OnGet()
{
_array = Config.GetSection("array").Get<ArrayExample>();
string s = null;
for (int j = 0; j < _array.Entries.Length; j++)
{
s += $"Index: {j} Value: {_array.Entries[j]} \n";
}
return Content(s);
}
}
Le code précédent retourne la sortie suivante :
Index: 0 Value: value0
Index: 1 Value: value1
Index: 2 Value: value2
Index: 3 Value: value3
Index: 4 Value: value4
Index: 5 Value: value5
Les fournisseurs de configuration personnalisés ne sont pas obligés d’implémenter la liaison de tableau.
Avertissement
Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.
L’exemple d’application montre comment créer un fournisseur de configuration de base qui lit les paires clé-valeur de configuration à partir d’une base de données à l’aide d’Entity Framework (EF).
Le fournisseur présente les caractéristiques suivantes :
ConfigurationBuilder
pour fournir la chaîne de connexion à partir d’un autre fournisseur de configuration.Définissez une entité EFConfigurationValue
pour le stockage des valeurs de configuration dans la base de données.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; }
public string Value { get; set; }
}
Ajoutez un EFConfigurationContext
pour stocker les valeurs configurées et y accéder.
EFConfigurationProvider/EFConfigurationContext.cs
:
// using Microsoft.EntityFrameworkCore;
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values { get; set; }
}
Créez une classe qui implémente IConfigurationSource.
EFConfigurationProvider/EFConfigurationSource.cs
:
// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
{
_optionsAction = optionsAction;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new EFConfigurationProvider(_optionsAction);
}
}
Créez le fournisseur de configuration personnalisé en héritant de ConfigurationProvider. Le fournisseur de configuration initialise la base de données quand elle est vide. Étant donné que les clés de configuration ne respectent pas la casse, le dictionnaire utilisé pour initialiser la base de données est créé avec le comparateur ne respectant pas la casse (StringComparer.OrdinalIgnoreCase).
EFConfigurationProvider/EFConfigurationProvider.cs
:
// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity-2005
var configValues =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
Une méthode d’extension AddEFConfiguration
permet d’ajouter la source de configuration à un ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
Le code suivant montre comment utiliser le EFConfigurationProvider
personnalisé dans Program.cs
:
// using Microsoft.EntityFrameworkCore;
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddEFConfiguration(
options => options.UseInMemoryDatabase("InMemoryDb"));
})
Le code suivant affiche les données de configuration dans les méthodes Startup
:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
Console.WriteLine($"MyKey : {Configuration["MyKey"]}");
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
Console.WriteLine($"Position:Title : {Configuration["Position:Title"]}");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Pour obtenir un exemple d’accès à la configuration à l’aide des méthodes pratiques de démarrage, consultez Démarrage de l’application : méthodes pratiques.
Le code suivant affiche les données de configuration dans une page Razor :
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Dans le code suivant, MyOptions
est ajouté au conteneur de service avec Configure et lié à la configuration :
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
services.AddRazorPages();
}
Le balisage suivant utilise la directive @inject
Razor pour résoudre et afficher les valeurs des options :
@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@inject IOptions<MyOptions> optionsAccessor
<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>
Le code suivant affiche les données de configuration dans une vue MVC :
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Les options configurées dans un délégué remplacent les valeurs définies dans les fournisseurs de configuration.
La configuration d’options avec un délégué est illustrée dans l’exemple 2 de l’exemple d’application.
Dans le code suivant, un service IConfigureOptions<TOptions> est ajouté au conteneur de services. Il utilise un délégué pour configurer les valeurs pour MyOptions
:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
});
services.AddRazorPages();
}
Le code suivant affiche les valeurs d’options :
public class Test2Model : PageModel
{
private readonly IOptions<MyOptions> _optionsDelegate;
public Test2Model(IOptions<MyOptions> optionsDelegate )
{
_optionsDelegate = optionsDelegate;
}
public ContentResult OnGet()
{
return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
$"Option2: {_optionsDelegate.Value.Option2}");
}
}
Dans l’exemple précédent, les valeurs de Option1
et Option2
sont spécifiées dans appsettings.json
, puis remplacées par le délégué configuré.
Avant que l’application ne soit configurée et démarrée, un hôte est configuré et lancé. L’hôte est responsable de la gestion du démarrage et de la durée de vie des applications. L’application et l’hôte sont configurés à l’aide des fournisseurs de configuration décrits dans cette rubrique. Les paires clé-valeur de la configuration de l’hôte sont également incluses dans la configuration de l’application. Pour plus d’informations sur l’utilisation des fournisseurs de configuration lors de la génération de l’hôte et sur l’impact des sources de configuration sur la configuration de l’hôte, consultez Vue d’ensemble des notions de base d’ASP.NET Core.
Pour plus de détails sur la configuration par défaut lors de l’utilisation de l’hôte Web, consultez la version ASP.NET Core 2.2. de cette rubrique.
DOTNET_
(par exemple DOTNET_ENVIRONMENT
) avec le fournisseur de configuration des variables d’environnement. Le préfixe (DOTNET_
) est supprimé lorsque les paires clé-valeur de la configuration sont chargées.ConfigureWebHostDefaults
) : ASPNETCORE_FORWARDEDHEADERS_ENABLED
est définie sur true
.Cette rubrique se rapporte uniquement à la configuration des applications. D’autres aspects concernant l’exécution et l’hébergement des applications ASP.NET Core sont configurés à l’aide des fichiers de configuration qui ne sont pas abordés dans cette rubrique :
launch.json
/launchSettings.json
sont des fichiers de configuration d’outils pour l’environnement de développement, décrits ci-après : web.config
est un fichier de configuration de serveur décrit dans les rubriques suivantes :
Les variables d’environnement définies dans launchSettings.json
remplacent celles qui sont définies dans l’environnement système.
Pour plus d’informations sur la migration de la configuration d’application à partir de versions antérieures d’ASP.NET, consultez Effectuer une mise à jour d’ASP.NET vers ASP.NET Core.
Une implémentation de IHostingStartup permet d’ajouter des améliorations à une application au démarrage à partir d’un assembly externe, en dehors de la classe Startup
de l’application. Pour plus d’informations, consultez Utiliser des assemblys d’hébergement au démarrage dans ASP.NET Core.
Commentaires sur ASP.NET Core
ASP.NET Core est un projet open source. Sélectionnez un lien pour fournir des commentaires :
Événement
Championnats du monde Power BI DataViz
14 févr., 16 h - 31 mars, 16 h
Avec 4 chances d’entrer, vous pourriez gagner un package de conférence et le rendre à la Live Grand Finale à Las Vegas
En savoir plusFormation
Module
Gérer les données de configuration d’application - Training
Gérer les données de configuration d’application
Documentation
Utiliser plusieurs environnements dans ASP.NET Core
Découvrez comment contrôler le comportement de l’application dans différents environnements dans les applications ASP.NET Core.
Modèle d’options dans ASP.NET Core
Découvrez comment utiliser le modèle d’options pour représenter des groupes de paramètres associés dans les applications ASP.NET Core.
Découvrez l’hôte web dans ASP.NET Core, qui est responsable de la gestion du démarrage et de la durée de vie des applications.