Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Door Rick Anderson en Kirk Larkin
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikel voor de huidige release.
Toepassingsconfiguratie in ASP.NET Core wordt uitgevoerd met behulp van een of meer configuratieproviders. Configuratieproviders lezen configuratiegegevens van sleutel-waardeparen met behulp van verschillende configuratiebronnen:
- Instellingenbestanden, zoals
appsettings.json
- Omgevingsvariabelen
- Azure Key Vault
- Azure App Configuration (Configuratie van Azure-apps)
- Opdrachtregelargumenten
- Aangepaste providers, geïnstalleerd of gemaakt
- Directorybestanden
- .NET-objecten in het geheugen
Dit artikel bevat informatie over de configuratie in ASP.NET Core. Zie .NET-configuratie voor meer informatie over het gebruik van configuratie in non-ASP.NET Core-apps.
Raadpleeg Blazor de ASP.NET Core-configuratie Blazor voor configuratierichtlijnen die worden toegevoegd aan of de richtlijnen in dit knooppunt vervangen.
Toepassings- en hostconfiguratie
ASP.NET Core-apps een host configureren en starten. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. De ASP.NET Core-sjablonen maken een WebApplicationBuilder sjabloon die de host bevat. Hoewel sommige configuraties kunnen worden uitgevoerd in zowel de host als de toepassingsconfiguratieproviders, moet doorgaans alleen de configuratie die nodig is voor de host worden uitgevoerd in de hostconfiguratie.
Toepassingsconfiguratie is de hoogste prioriteit en wordt in de volgende sectie beschreven. Hostconfiguratie volgt de toepassingsconfiguratie en wordt beschreven in dit artikel.
Standaardbronnen voor toepassingsconfiguratie
ASP.NET Core-web-apps die zijn gemaakt met dotnet nieuwe of Visual Studio genereren de volgende code:
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialiseert een nieuw exemplaar van de WebApplicationBuilder-klasse met vooraf geconfigureerde standaardwaarden. De geïnitialiseerde WebApplicationBuilder
(builder
) biedt standaardconfiguratie voor de app in de volgende volgorde, van hoogste naar laagste prioriteit:
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen zonder voorvoegsel met behulp van de configuratieprovider voor omgevingsvariabelen zonder voorvoegsel.
-
Gebruikersgeheimen wanneer de app draait in de
Development
-omgeving. -
appsettings.{Environment}.json
met behulp van de JSON-configuratieprovider. Bijvoorbeeldappsettings.Production.json
enappsettings.Development.json
. - appsettings.json met de JSON-configuratieprovider.
- Een terugval naar de hostconfiguratie die wordt beschreven in de volgende sectie.
Opmerking: WebApplication.CreateBuilder(args)
mag slechts eenmaal worden aangeroepen in apps die afhankelijk zijn van IIS-hosting in proces.
Standaardhostconfiguratiebronnen
De volgende lijst bevat de standaardhostconfiguratiebronnen van hoogste naar laagste prioriteit voor WebApplicationBuilder:
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider
- Omgevingsvariabelen met het voorvoegsel
DOTNET_
gebruiken met behulp van de configuratieprovider voor omgevingsvariabelen. - Omgevingsvariabelen met het voorvoegsel
ASPNETCORE_
met behulp van de configuratieprovider voor omgevingsvariabelen.
Voor de .NET Generic Host en Web Host zijn de standaardhostconfiguratiebronnen van hoogste naar laagste prioriteit:
- Omgevingsvariabelen met het
ASPNETCORE_
-voorvoegsel met behulp van de configuratieprovider voor omgevingsvariabelen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider
- Omgevingsvariabelen die beginnen met
DOTNET_
met behulp van de configuratieprovider voor omgevingsvariabelen.
Wanneer een configuratiewaarde is ingesteld in de host- en toepassingsconfiguratie, wordt de toepassingsconfiguratie gebruikt.
Hostvariabelen
De volgende variabelen worden vroeg vergrendeld bij het initialiseren van de hostbuilders en kunnen niet worden beïnvloed door de configuratie van de toepassing:
- Toepassingsnaam
-
Omgevingsnaam, bijvoorbeeld
Development
,Production
enStaging
- Inhoudroot
- Webroot
- Of er moet worden gescand op hosting startassemblies en welke assemblies gescand moeten worden.
- Variabelen die worden gelezen door de app- en bibliotheekcode vanuit HostBuilderContext.Configuration in IHostBuilder.ConfigureAppConfiguration-callbacks.
Elke andere hostinstelling wordt gelezen uit de configuratie van de toepassing in plaats van de hostconfiguratie.
URLS
is een van de vele algemene hostinstellingen die geen bootstrap-instelling is. Net als elke andere hostinstelling die niet in de vorige lijst staat, URLS
wordt deze later gelezen uit de configuratie van de toepassing. Hostconfiguratie is een terugval voor toepassingsconfiguratie, dus hostconfiguratie kan worden gebruikt om in te stellen URLS
, maar deze wordt overschreven door elke configuratiebron in de configuratie van de toepassing, zoals appsettings.json
.
Zie De hoofdmap, app-naam en omgeving van deinhoud wijzigen en de inhoudshoofdmap, app-naam en omgeving wijzigen op omgevingsvariabelen of opdrachtregel voor meer informatie
De overige secties in dit artikel verwijzen naar toepassingsconfiguratie.
Toepassingsconfiguratieproviders
De volgende code geeft de ingeschakelde configuratieproviders weer in de volgorde waarin ze zijn toegevoegd:
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);
}
}
In de voorgaande lijst met standaardconfiguratiebronnen met de hoogste tot laagste prioriteit worden de providers weergegeven in de tegenovergestelde volgorde waarin ze worden toegevoegd aan de door de sjabloon gegenereerde toepassing. De JSON-configuratieprovider wordt bijvoorbeeld toegevoegd vóór de opdrachtregelconfiguratieprovider.
Configuratieproviders die later worden toegevoegd, hebben een hogere prioriteit en overschrijven eerdere sleutelinstellingen. Als MyKey
is ingesteld in zowel appsettings.json
als in de omgeving, wordt de waarde van de omgeving gebruikt. Met behulp van de standaardconfiguratieproviders overschrijft de opdrachtregelconfiguratieprovider alle andere providers.
Zie Instellingen voor standaardbouwer voor meer informatieCreateBuilder
.
appsettings.json
Houd rekening met het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
De standaardconfiguratie JsonConfigurationProvider wordt geladen in de volgende volgorde:
appsettings.json
-
appsettings.{Environment}.json
: bijvoorbeeld deappsettings.Production.json
enappsettings.Development.json
bestanden. De omgevingsversie van het bestand wordt geladen op basis van de IHostingEnvironment.EnvironmentName. Zie Meerdere omgevingen gebruiken in ASP.NET Core voor meer informatie.
appsettings.{Environment}.json
waarden overschrijven sleutels in appsettings.json
. Bijvoorbeeld, standaard:
- Tijdens ontwikkeling overschrijft
appsettings.Development.json
configuratiewaarden inappsettings.json
. - In productie overschrijft
appsettings.Production.json
configuratie de waarden inappsettings.json
. Bijvoorbeeld bij het implementeren van de app in Azure.
Als een configuratiewaarde moet worden gegarandeerd, raadpleegt u GetValue. In het voorgaande voorbeeld worden alleen tekenreeksen gelezen en wordt geen standaardwaarde ondersteund.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
-bestand en het appsettings.{Environment}.json
-bestand nadat de app is gestart, worden gelezen door de JSON-configuratieprovider.
Opmerkingen in appsettings.json
Opmerkingen in appsettings.json
en appsettings.{Environment}.json
bestanden worden ondersteund met javaScript- of C#-stijlopmerkingen.
In sommige IDE's (Integrated Development Environments) worden fouten weergegeven bij het bewerken van een JSON-bestand dat opmerkingen bevat. Over het algemeen kunt u opmerkingenfouten en waarschuwingen negeren, maar u kunt ze meestal ook uitschakelen met een instelling in de IDE. Voeg in Visual Studio Code bijvoorbeeld het volgende toe aan het settings.json
bestand om de fouten uit te schakelen:
"files.associations": {
"appsettings*.json": "jsonc"
}
Voor andere IDE's raadpleegt u de documentatie van het hulpprogramma en andere productondersteuningskanalen om te bepalen hoe u de fouten stil kunt leggen.
Hiërarchische configuratiegegevens binden met behulp van het optiespatroon
De voorkeursmethode voor het lezen van gerelateerde configuratiewaarden is het gebruik van het patroon opties. Bijvoorbeeld om de volgende configuratiewaarden te lezen:
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Maak de volgende PositionOptions
klasse:
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Een opties klasse:
- Moet niet-abstract zijn met een openbare parameterloze constructor.
- Alle openbare lees-schrijfeigenschappen van het type zijn gebonden.
- Velden zijn niet gebonden. In de voorgaande code,
Position
is niet gebonden. HetPosition
veld wordt gebruikt, zodat de tekenreeks"Position"
niet hard gecodeerd hoeft te worden in de app wanneer de klasse aan een configuratieprovider wordt gekoppeld.
De volgende code:
- Roept ConfigurationBinder.Bind aan om de
PositionOptions
klasse aan dePosition
sectie te binden. - Geeft de
Position
configuratiegegevens weer.
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
ConfigurationBinder.Get<T>
bindt en retourneert het opgegeven type.
ConfigurationBinder.Get<T>
kan handiger zijn dan het gebruik.ConfigurationBinder.Bind
De volgende code laat zien hoe u deze kunt gebruiken ConfigurationBinder.Get<T>
met de PositionOptions
klasse:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
Een alternatieve benadering bij het gebruik van het optiepatroon is om de Position
sectie te binden en toe te voegen aan de afhankelijkheidsinjectieservicecontainer. In de volgende code PositionOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
Met behulp van de voorgaande code leest de volgende code de positieopties:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand nadat de app is gestart, niet gelezen. Als u wijzigingen wilt lezen nadat de app is gestart, gebruikt u IOptionsSnapshot.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
bestand en het appsettings.{Environment}.json
bestand nadat de app gestart is, worden gelezen door JSON-configuratieprovider.
Zie de JSON-configuratieprovider in dit document voor informatie over het toevoegen van extra JSON-configuratiebestanden.
Serviceverzameling combineren
Houd rekening met het volgende waarmee services worden geregistreerd en opties worden geconfigureerd:
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();
Gerelateerde groepen registraties kunnen worden verplaatst naar een extensiemethode om services te registreren. De configuratieservices worden bijvoorbeeld toegevoegd aan de volgende klasse:
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;
}
}
}
De resterende services worden geregistreerd in een vergelijkbare klasse. De volgende code maakt gebruik van de nieuwe extensiemethoden om de services te registreren:
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Opmerking: Elke services.Add{GROUP_NAME}
extensiemethode voegt services toe en configureert deze mogelijk.
AddControllersWithViews voegt bijvoorbeeld de services toe die vereist zijn door MVC-controllers met weergaven, en AddRazorPages voegt de services toe die vereist zijn door Razor Pagina's.
Beveiligings- en gebruikersgeheimen
Richtlijnen voor configuratiegegevens:
- Sla nooit wachtwoorden of andere gevoelige gegevens op in configuratieprovidercode of in configuratiebestanden met tekst zonder opmaak. Het hulpprogramma Secret Manager kan worden gebruikt om geheimen voor ontwikkelingsdoeleinden op te slaan.
- Gebruik geen productiegeheimen in ontwikkel- of testomgevingen.
- Geef geheimen buiten het project op, zodat ze niet per ongeluk kunnen worden doorgevoerd in een opslagplaats met broncode.
- Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromen voor meer informatie.
Standaard wordt de configuratiebron voor gebruikersgeheimen geregistreerd na de JSON-configuratiebronnen. Daarom hebben gebruikersgeheimsleutels voorrang op sleutels in appsettings.json
en appsettings.{Environment}.json
.
Voor meer informatie over het opslaan van wachtwoorden of andere gevoelige gegevens:
- Meerdere omgevingen gebruiken in ASP.NET Core
- Veilige opslag van app-geheimen in ontwikkeling in ASP.NET Core: bevat advies over het gebruik van omgevingsvariabelen voor het opslaan van gevoelige gegevens. Het hulpprogramma Secret Manager gebruikt de bestandsconfiguratieprovider om gebruikersgeheimen op te slaan in een JSON-bestand op het lokale systeem.
- Azure Key Vault slaat app-geheimen veilig op voor ASP.NET Core-apps. Zie de Azure Key Vault-configuratieprovider in ASP.NET Core voor meer informatie.
Omgevingsvariabelen zonder voorvoegsel
Omgevingsvariabelen zonder voorvoegsel zijn andere omgevingsvariabelen dan omgevingsvariabelen die zijn voorafgegaan door ASPNETCORE_
of DOTNET_
. Bijvoorbeeld, de sjablonen voor ASP.NET Core-webtoepassingen stellen "ASPNETCORE_ENVIRONMENT": "Development"
in launchSettings.json
in. Zie voor meer informatie over ASPNETCORE_
en DOTNET_
omgevingsvariabelen:
-
Lijst met standaardconfiguratiebronnen van hoogste tot laagste prioriteit waaronder niet-geprefixeerde,
ASPNETCORE_
-geprefixeerde enDOTNETCORE_
-geprefixeerde omgevingsvariabelen. -
DOTNET_
omgevingsvariabelen die buiten Microsoft.Extensions.Hosting worden gebruikt.
Met behulp van de standaardconfiguratie laadt de EnvironmentVariablesConfigurationProvider configuratie van sleutel-waardeparen van de omgevingsvariabele na het lezenappsettings.json
appsettings.{Environment}.json
, en gebruikersgeheimen. Sleutelwaarden die uit de omgeving worden gelezen, overschrijven daarom waarden uit appsettings.json
, appsettings.{Environment}.json
en gebruikersgeheimen.
Het :
-scheidingsteken werkt niet met hiërarchische sleutels van omgevingsvariabelen op alle platformen. Het :
-scheidingsteken wordt bijvoorbeeld niet ondersteund door Bash. Het dubbele onderstrepingsteken, __
, is:
- Ondersteund door alle platforms.
- Automatisch vervangen door dubbelpunt,
:
.
De volgende opdrachten:
- Stel de omgevingssleutels en -waarden in van het voorgaande voorbeeld in Windows.
- Test de instellingen bij het gebruik van het voorbeelddownload. De
dotnet run
opdracht moet worden uitgevoerd in de projectmap.
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
De voorgaande omgevingsinstellingen:
- Worden alleen ingesteld in processen die zijn gestart vanuit het opdrachtvenster waarin ze zijn ingesteld.
- Wordt niet gelezen door browsers die zijn gestart met Visual Studio.
De volgende setx-opdrachten kunnen worden gebruikt om de omgevingssleutels en -waarden in Windows in te stellen. In tegenstelling tot set
, setx
instellingen blijven behouden.
/M
stelt de variabele in de systeemomgeving in. Als de /M
switch niet wordt gebruikt, wordt een gebruikersomgevingsvariabele ingesteld.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Testen of de voorgaande opdrachten appsettings.json
en appsettings.{Environment}.json
overschrijven:
- Met Visual Studio: Visual Studio afsluiten en opnieuw starten.
- Met de CLI: Start een nieuw opdrachtvenster en voer dit in
dotnet run
.
Roep AddEnvironmentVariables een tekenreeks aan om een voorvoegsel voor omgevingsvariabelen op te geven:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
In de voorgaande code:
-
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
wordt toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider. - Omgevingsvariabelen die zijn ingesteld met het
MyCustomPrefix_
voorvoegsel overschrijven de standaardconfiguratieproviders. Dit omvat omgevingsvariabelen zonder het voorvoegsel.
Het voorvoegsel wordt verwijderd wanneer de configuratiesleutel-waardeparen worden gelezen.
Met de volgende opdrachten wordt het aangepaste voorvoegsel getest:
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
De standaardconfiguratie laadt omgevingsvariabelen en opdrachtregelargumenten voorafgegaan door DOTNET_
en ASPNETCORE_
. De DOTNET_
en ASPNETCORE_
voorvoegsels worden gebruikt door ASP.NET Core voor host- en app-configuratie, maar niet voor gebruikersconfiguratie. Zie .NET Generic Host voor meer informatie over host- en app-configuratie.
Selecteer op Azure-app Service de optie Nieuwe toepassingsinstelling Azure-app servicetoepassingsinstellingen zijn:
- Versleuteld at-rest en verzonden via een versleuteld kanaal.
- Weergegeven als omgevingsvariabelen.
Zie Azure Apps: App-configuratie overschrijven met behulp van Azure Portal voor meer informatie.
Zie verbindingsreeksvoorvoegsels voor informatie over Verbindingsreeksen in Azure Database.
Naamgeving van omgevingsvariabelen
Namen van omgevingsvariabelen weerspiegelen de structuur van een appsettings.json
bestand. Elk element in de hiërarchie wordt gescheiden door een dubbele onderstrepingsteken (bij voorkeur) of een dubbele punt. Wanneer de elementstructuur een matrix bevat, moet de matrixindex worden behandeld als een extra elementnaam in dit pad. Houd rekening met het volgende appsettings.json
bestand en de bijbehorende equivalente waarden die worden weergegeven als omgevingsvariabelen.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Omgevingsvariabelen
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
Omgevingsvariabelen die zijn ingesteld in gegenereerde launchSettings.json
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving. De ASP.NET Core-websjablonen genereren bijvoorbeeld een launchSettings.json
bestand waarmee de eindpuntconfiguratie wordt ingesteld op:
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Door de applicationUrl
te configureren, wordt de ASPNETCORE_URLS
omgevingsvariabele ingesteld en worden waarden in de omgeving overschreven.
Omgevingsvariabelen ontsnappen in Linux
Op Linux moeten de waarden van URL-omgevingsvariabelen worden geëscaped zodat systemd
deze kan parsen. Gebruik de Linux-tool systemd-escape
die http:--localhost:5001
oplevert
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Omgevingsvariabelen weergeven
In de volgende code worden de omgevingsvariabelen en -waarden weergegeven bij het opstarten van toepassingen. Dit kan handig zijn bij het opsporen van fouten in de omgevingsinstellingen:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
Opdrachtregel
Met behulp van de standaardconfiguratie laadt de CommandLineConfigurationProvider de configuratie, van sleutel-waardekoppels van opdrachtregelargumenten, na de volgende configuratiebronnen:
-
appsettings.json
enappsettings.{Environment}.json
bestanden. - App-geheimen in de ontwikkelomgeving.
- Omgevingsvariabelen.
Standaard worden configuratiewaarden die zijn ingesteld op de opdrachtregel configuratiewaarden vervangen die zijn ingesteld bij alle andere configuratieproviders.
Opdrachtregelargumenten
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
De sleutelwaarde:
- Moet volgen
=
of de sleutel moet een voorvoegsel hebben van--
of/
wanneer de waarde een spatie volgt. - Is niet vereist als
=
deze wordt gebruikt. Bijvoorbeeld:MySetting=
.
Combineer binnen dezelfde opdracht geen sleutel-waardeparen met opdrachtregelargumenten die worden gebruikt =
met sleutel-waardeparen die gebruikmaken van een spatie.
Switchtoewijzingen
Schakelmappingen staan vervangingslogica voor sleutelnamen toe. Geef een woordenlijst op met switchvervangingen voor de AddCommandLine methode.
Wanneer het woordenboek voor switchtoewijzingen wordt gebruikt, wordt het woordenboek gecontroleerd op een sleutel die overeenkomt met de sleutel die door een opdrachtregelargument wordt geleverd. Als de opdrachtregelsleutel wordt gevonden in de woordenlijst, wordt de waarde van de woordenlijst teruggegeven om het sleutel-waardepaar in te stellen in de configuratie van de app. Een switchtoewijzing is vereist voor elke opdrachtregelsleutel die wordt voorafgegaan door één streepje (-
).
Regels voor sleutels van schakelmappings in woordenboeken:
- Schakelopties moeten beginnen met
-
of--
. - De woordenlijst voor switchtoewijzingen mag geen dubbele sleutels bevatten.
Als u een woordenlijst voor switchtoewijzingen wilt gebruiken, geeft u deze door bij de aanroep van 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();
Voer de volgende opdracht uit om de sleutelvervanging te testen:
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
De volgende code toont de sleutelwaarden voor de vervangen sleutels:
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"]}'");
}
}
Voor apps die switchtoewijzingen gebruiken, mag de aanroep geen argumenten doorgeven. De CreateDefaultBuilder
aanroep van AddCommandLine
de methode bevat geen toegewezen switches en er is geen manier om de woordenlijst voor switchtoewijzing door te geven aan CreateDefaultBuilder
. De oplossing is niet om de argumenten door te geven aanCreateDefaultBuilder
, maar in plaats daarvan de methode van AddCommandLine
de ConfigurationBuilder
methode toe te staan zowel de argumenten als de woordenlijst voor switchtoewijzing te verwerken.
Omgevings- en opdrachtregelargumenten instellen met Visual Studio
Omgevings- en opdrachtregelargumenten kunnen in Visual Studio worden ingesteld vanuit het dialoogvenster Opstartprofielen:
- Klik in Solution Explorer met de rechtermuisknop op het project en selecteer Eigenschappen.
- Selecteer het tabblad Foutopsporings > algemeen en selecteer de gebruikersinterface voor het openen van startprofielen voor foutopsporing.
Hiërarchische configuratiegegevens
De configuratie-API leest hiërarchische configuratiegegevens door de hiërarchische gegevens plat te maken met behulp van een scheidingsteken in de configuratiesleutels.
Het voorbeelddownload bevat het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code van het voorbeelddownload worden verschillende configuratie-instellingen weergegeven:
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}");
}
}
De voorkeursmethode voor het lezen van hiërarchische configuratiegegevens is het gebruik van het optiespatroon. Zie Hiërarchische bindingsconfiguratiegegevens in dit document voor meer informatie.
GetSection en GetChildren methoden zijn beschikbaar om secties en onderliggende elementen van een sectie in de configuratiegegevens te isoleren. Deze methoden worden verderop beschreven in GetSection, GetChildren en Exists.
Configuratiesleutels en -waarden
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
Configuratiesleutels:
- Zijn niet hoofdlettergevoelig.
ConnectionString
enconnectionstring
worden bijvoorbeeld behandeld als gelijkwaardige sleutels. - Als een sleutel en waarde zijn ingesteld in meer dan één configuratieprovider, wordt de waarde van de laatste toegevoegde provider gebruikt. Zie De standaardconfiguratie voor meer informatie.
- Hiërarchische sleutels
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
:
) op alle platforms. - In omgevingsvariabelen werkt een dubbele punt als scheidingsteken mogelijk niet op alle platforms. Een dubbele onderstrepingsteken,
__
, wordt ondersteund door alle platforms en wordt automatisch omgezet naar een dubbelpunt:
. - In Azure Key Vault gebruiken hiërarchische sleutels
--
als scheidingsteken. De Azure Key Vault-configuratieprovider vervangt automatisch--
door een:
wanneer de geheimen in de configuratie van de app worden geladen.
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
- De ConfigurationBinder functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Matrixbinding wordt beschreven in de matrix binden aan een klassesectie .
Configuratiewaarden:
- Dit zijn tekenreeksen.
- Null-waarden kunnen niet worden opgeslagen in de configuratie of gebonden aan objecten.
Configuratieproviders
In de volgende tabel ziet u de configuratieproviders die beschikbaar zijn voor ASP.NET Core-apps.
Aanbieder | Zorgt voor configuratie vanuit |
---|---|
Azure Key Vault-configuratieprovider | Azure Key Vault |
Azure-app-configuratieprovider | Azure App Configuration (Configuratie van Azure-apps) |
Commandoregelconfiguratieprovider | Opdrachtregelparameters |
aangepaste configuratieprovider | Aangepaste bron |
configuratieprovider voor omgevingsvariabelen | Omgevingsvariabelen |
bestandsconfiguratieprovider | INI-, JSON- en XML-bestanden |
nl-NL: Sleutel-per-bestand-configuratieprovider | Directorybestanden |
geheugenconfiguratieprovider | Verzamelingen in het geheugen |
Gebruikersgeheimen | Het bestand in de gebruikersprofielmap |
Configuratiebronnen worden gelezen in de volgorde waarin hun configuratieproviders worden opgegeven. Rangschik configuratieproviders in de code volgens de prioriteiten voor de configuratiebronnen die de app nodig heeft.
Een typische reeks configuratieproviders is:
appsettings.json
appsettings.{Environment}.json
- Gebruikersgeheimen
- Omgevingsvariabelen met behulp van de configuratieprovider Omgevingsvariabelen .
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
Een veelvoorkomende procedure is om de opdrachtregelconfiguratieprovider voor het laatst toe te voegen in een reeks providers om opdrachtregelargumenten toe te staan om de configuratie die door de andere providers is ingesteld, te overschrijven.
De voorgaande reeks providers wordt gebruikt in de standaardconfiguratie.
Verbindingsreeksvoorvoegsels
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
De configuratie-API heeft speciale verwerkingsregels voor vier verbindingsreeks omgevingsvariabelen. Deze verbindingsreeks zijn betrokken bij het configureren van Azure-verbindingsreeks s voor de app-omgeving. Omgevingsvariabelen met de voorvoegsels die in de tabel worden weergegeven, worden in de app geladen met de standaardconfiguratie of wanneer er geen voorvoegsel wordt opgegeven aan AddEnvironmentVariables
.
Verbindingsreeksvoorvoegsel | Aanbieder |
---|---|
CUSTOMCONNSTR_ |
Aangepaste leverancier |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Wanneer een omgevingsvariabele wordt gedetecteerd en in de configuratie wordt geladen met een van de vier voorvoegsels die in de tabel worden weergegeven:
- De configuratiesleutel wordt gemaakt door het voorvoegsel van de omgevingsvariabele te verwijderen en een sectie met een configuratiesleutel (
ConnectionStrings
) toe te voegen. - Er wordt een nieuw sleutel-waardepaar voor de configuratie gemaakt dat de databaseverbindingsprovider vertegenwoordigt (met uitzondering van
CUSTOMCONNSTR_
, waarvoor geen vermelde provider is opgegeven).
Sleutel voor omgevingsvariabele | Geconverteerde configuratiesleutel | Providerconfiguratie-vermelding |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Configuratievermelding niet gemaakt. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
Bestandsconfiguratieprovider
FileConfigurationProvider is de basisklasse voor het laden van de configuratie van het bestandssysteem. De volgende configuratieproviders zijn afgeleid van FileConfigurationProvider
:
INI-configuratieprovider
De IniConfigurationProvider laadt tijdens runtime configuratie vanuit INI-bestandssleutel-waardeparen.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyIniConfig.ini
en MyIniConfig.{Environment}.ini
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyIniConfig.ini
bestand:
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
JSON-configuratieprovider
De JsonConfigurationProvider laadt de configuratie vanuit de sleutel-waardeparen van het JSON-bestand.
Overbelastingen kunnen het volgende opgeven:
- Of het bestand optioneel is.
- Of de configuratie opnieuw wordt geladen als het bestand wordt gewijzigd.
Houd rekening met de volgende code:
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();
De voorgaande code:
- Hiermee configureert u de JSON-configuratieprovider om het
MyConfig.json
bestand te laden met de volgende opties:-
optional: true
: Het bestand is optioneel. -
reloadOnChange: true
: het bestand wordt opnieuw geladen wanneer wijzigingen worden opgeslagen.
-
- Leest de standaardconfiguratieproviders vóór het
MyConfig.json
bestand. Instellingen in deMyConfig.json
instelling voor het overschrijven van bestanden in de standaardconfiguratieproviders, waaronder de configuratieprovider voor omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
Normaal gesproken wilt u geen aangepast JSON-bestand dat waarden overschrijft die zijn ingesteld in de configuratieprovider omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
XML-configuratieprovider
De XmlConfigurationProvider configuratie wordt tijdens runtime geladen van sleutel-waardeparen van XML-bestanden.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyXMLFile.xml
en MyXMLFile.{Environment}.xml
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyXMLFile.xml
bestand:
<?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>
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
Herhalende elementen die dezelfde elementnaam gebruiken, werken als het name
kenmerk wordt gebruikt om de elementen te onderscheiden:
<?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>
De volgende code leest het vorige configuratiebestand en geeft de sleutels en waarden weer:
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"
);
}
}
Kenmerken kunnen worden gebruikt om waarden op te geven:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
In het vorige configuratiebestand worden de volgende sleutels geladen met value
:
- key:attribute
- section:key:attribute
Configuratieprovider voor sleutel per bestand
De KeyPerFileConfigurationProvider map maakt gebruik van de bestanden van een map als configuratiesleutel-waardeparen. De sleutel is de bestandsnaam. De waarde bevat de inhoud van het bestand. De key-per-file-configuratieprovider wordt gebruikt in Docker-hostingscenario's.
Als u key-per-file-configuratie wilt activeren, roept u de AddKeyPerFile extensiemethode aan op een exemplaar van ConfigurationBuilder. De directoryPath
bestanden moeten een absoluut pad zijn.
Overbelastingen maken het opgeven van:
- Een
Action<KeyPerFileConfigurationSource>
gemachtigde die de bron configureert. - Of de map optioneel is en of het pad naar de map is.
Het dubbele onderstrepingsteken (__
) wordt gebruikt als scheidingsteken voor configuratiesleutels in bestandsnamen. De bestandsnaam Logging__LogLevel__System
produceert bijvoorbeeld de configuratiesleutel Logging:LogLevel:System
.
Aanroepen ConfigureAppConfiguration
bij het bouwen van de host om de configuratie van de app op te geven:
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Geheugenconfiguratieprovider
Hierbij MemoryConfigurationProvider wordt een verzameling in het geheugen gebruikt als configuratiesleutel-waardeparen.
Met de volgende code wordt een geheugenverzameling toegevoegd aan het configuratiesysteem:
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();
In de volgende code van het voorbeelddownload worden de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
In de voorgaande code config.AddInMemoryCollection(Dict)
wordt deze toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider.
Zie Een matrix binden voor een ander voorbeeld met behulp van MemoryConfigurationProvider
.
Kestrel eindpuntconfiguratie
Kestrel specifieke eindpuntconfiguratie overschrijft alle serveroverschrijdende eindpuntconfiguraties. Configuraties voor eindpunten tussen servers zijn onder andere:
- UseUrls
-
--urls
op de commandoregel - De omgevingsvariabele
ASPNETCORE_URLS
Houd rekening met het volgende appsettings.json
bestand dat wordt gebruikt in een ASP.NET Core-web-app:
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Wanneer de voorgaande gemarkeerde markering wordt gebruikt in een ASP.NET Core-web-app en de app wordt gestart op de opdrachtregel met de volgende server-overschrijdende eindpuntconfiguratie:
dotnet run --urls="https://localhost:7777"
Kestrel verbindt met het eindpunt dat specifiek is geconfigureerd voor Kestrel in het appsettings.json
bestand (https://localhost:9999
) en niet https://localhost:7777
.
Overweeg het Kestrel specifieke eindpunt dat is geconfigureerd als een omgevingsvariabele:
set Kestrel__Endpoints__Https__Url=https://localhost:8888
In de voorgaande omgevingsvariabele Https
is dit de naam van het Kestrel specifieke eindpunt. Het voorgaande appsettings.json
bestand definieert ook een specifiek eindpunt met de Kestrel naam Https
. Standaard wordt de omgevingsvariabele die gebruikmaakt van de configuratieprovider Omgevingsvariabelen gelezen nadat appsettings.{Environment}.json
, daarom wordt de voorgaande omgevingsvariabele gebruikt voor het Https
eindpunt.
WaardeOphalen
ConfigurationBinder.GetValue extraheert één waarde uit de configuratie met een opgegeven sleutel en converteert deze naar het opgegeven type:
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}");
}
}
In de voorgaande code, als NumberKey
niet in de configuratie wordt gevonden, wordt de standaardwaarde 99
gebruikt.
GetSection, GetChildren en Exists
Bekijk het volgende MySubsection.json
bestand voor de volgende voorbeelden:
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
De volgende code voegt MySubsection.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
GetSection
IConfiguration.GetSection retourneert een configuratiesubsectie met de opgegeven subsectiesleutel.
De volgende code retourneert waarden voor 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"]}'");
}
}
De volgende code retourneert waarden voor 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
keert null
nooit terug. Als er geen overeenkomende sectie wordt gevonden, wordt een lege IConfigurationSection
sectie geretourneerd.
Wanneer GetSection
een overeenkomende sectie retourneert, wordt Value niet ingevuld.
Key en Path worden geretourneerd wanneer de sectie bestaat.
GetChildren and Exists
De volgende code roept IConfiguration.GetChildren waarden aan en retourneert waarden voor 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);
}
}
De voorgaande code aanroepen ConfigurationExtensions.Exists om te controleren of de sectie bestaat:
Een matrix binden
De ConfigurationBinder.Bind functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Elke matrixindeling die een numeriek sleutelsegment beschikbaar maakt, kan matrixbindingen uitvoeren op een POCO-klassematrix .
Houd rekening met MyArray.json
uit de voorbeeld-download:
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
De volgende code voegt MyArray.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Met de volgende code wordt de configuratie gelezen en worden de waarden weergegeven:
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; }
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
In de voorgaande uitvoer heeft Index 3 een waarde value40
die overeenkomt met "4": "value40",
in MyArray.json
. De afhankelijke matrixindexen zijn doorlopend en zijn niet gebonden aan de configuratiesleutelindex. De configuratiebinding kan geen null-waarden binden of null-vermeldingen maken in afhankelijke objecten.
Aangepaste configuratieprovider
De voorbeeld-app laat zien hoe u een eenvoudige configuratieprovider maakt die configuratiesleutel-waardeparen van een database leest met behulp van Entity Framework (EF).
De provider heeft de volgende kenmerken:
- De EF-database in het geheugen wordt gebruikt voor demonstratiedoeleinden. Als u een database wilt gebruiken waarvoor een verbindingsreeks is vereist, implementeert u een secundaire
ConfigurationBuilder
om de verbindingsreeks van een andere configuratieprovider op te geven. - De provider leest een databasetabel in de configuratie bij het opstarten. De provider doorzoekt de database niet per sleutel.
- Reload-on-change is niet geïmplementeerd, dus het bijwerken van de database nadat de app is gestart, heeft geen invloed op de configuratie van de app.
Definieer een EFConfigurationValue
entiteit voor het opslaan van configuratiewaarden in de database.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Voeg een EFConfigurationContext
toe om de geconfigureerde waarden op te slaan en te openen.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Maak een klasse die IConfigurationSource implementeert.
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);
}
Maak de aangepaste configuratieprovider door deze over te nemen van ConfigurationProvider. De configuratieprovider initialiseert de database wanneer deze leeg is. Omdat configuratiesleutels niet hoofdlettergevoelig zijn, wordt de woordenlijst die wordt gebruikt om de database te initialiseren gemaakt met de niet-hoofdlettergevoelige vergelijking (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;
}
}
Met een AddEFConfiguration
extensiemethode kan de configuratiebron worden toegevoegd aan een ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
De volgende code laat zien hoe u de aangepaste EFConfigurationProvider
code gebruikt in Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
Toegangsconfiguratie met afhankelijkheidsinjectie (DI)
Configuratie kan worden geïnjecteerd in services met behulp van afhankelijkheidsinjectie (DI) door de service IConfiguration op te lossen.
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Zie voor informatie over hoe u waarden kunt benaderen met behulp van IConfiguration
, GetValue en GetSection, GetChildren en Exists in dit artikel.
Configuratie voor toegang in Razor Pagina's
De volgende code geeft configuratiegegevens weer op een Razor pagina:
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
In de volgende code MyOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
In de volgende markeringen wordt de @inject
Razor instructie gebruikt om de waarde van de opties op te lossen en weer te geven:
@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>
Toegangsconfiguratie in een MVC-weergavebestand
De volgende code geeft configuratiegegevens weer in een MVC-weergave:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Toegangsconfiguratie in Program.cs
De volgende code heeft toegang tot de configuratie in het Program.cs
bestand.
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();
In appsettings.json
het voorgaande voorbeeld:
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Opties configureren met een gemachtigde
Opties die zijn geconfigureerd in een delegaat, overschrijven waarden die zijn ingesteld in de configuratieproviders.
In de volgende code wordt een IConfigureOptions<TOptions> service toegevoegd aan de servicecontainer. Er wordt een gemachtigde gebruikt om waarden te configureren voor 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();
In de volgende code worden de optieswaarden weergegeven:
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}");
}
}
In het voorgaande voorbeeld worden de waarden van Option1
en Option2
opgegeven in appsettings.json
en vervolgens overschreven door de geconfigureerde gemachtigde.
Host versus app-configuratie
Voordat de app is geconfigureerd en gestart, wordt een host geconfigureerd en gestart. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. Zowel de app als de host worden geconfigureerd met behulp van de configuratieproviders die in dit onderwerp worden beschreven. Hostconfiguratiesleutel-waardeparen worden ook opgenomen in de configuratie van de app. Zie voor meer informatie over hoe de configuratieproviders worden gebruikt wanneer de host wordt gebouwd en hoe configuratiebronnen van invloed zijn op de hostconfiguratie ASP.NET overzicht van basisbeginselen.
Standaardhostconfiguratie
Zie de ASP.NET Core 2.2-versie van dit onderwerp voor meer informatie over de standaardconfiguratie wanneer u de webhost gebruikt.
- Hostconfiguratie wordt geleverd van:
- Omgevingsvariabelen voorafgegaan door
DOTNET_
(bijvoorbeeldDOTNET_ENVIRONMENT
) met behulp van de configuratieprovider Omgevingsvariabelen. Het voorvoegsel (DOTNET_
) wordt verwijderd wanneer de configuratiesleutel-waardeparen worden geladen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen voorafgegaan door
- De standaardconfiguratie van de webhost is ingesteld (
ConfigureWebHostDefaults
):- Kestrel wordt gebruikt als de webserver en geconfigureerd met behulp van de configuratieproviders van de app.
- Voeg middleware voor het filteren van hosts toe.
- Voeg Forwarded Headers-middleware toe als de
ASPNETCORE_FORWARDEDHEADERS_ENABLED
omgevingsvariabele is gesteld optrue
. - IIS-integratie inschakelen.
Andere configuratie
Dit onderwerp heeft alleen betrekking op app-configuratie. Andere aspecten van het uitvoeren en hosten van ASP.NET Core-apps worden geconfigureerd met behulp van configuratiebestanden die niet in dit onderwerp worden behandeld:
-
launch.json
/launchSettings.json
zijn configuratiebestanden voor tooling in de ontwikkelomgeving, beschreven:- In Gebruik meerdere omgevingen in ASP.NET Core.
- In de documentatieset waarin de bestanden worden gebruikt voor het configureren van ASP.NET Core-apps voor ontwikkelingsscenario's.
-
web.config
is een serverconfiguratiebestand dat wordt beschreven in de volgende onderwerpen:
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving.
Zie Configuratie migreren naar ASP.NET Core voor meer informatie over het migreren van app-configuratie van eerdere versies van ASP.NET.
Configuratie toevoegen vanuit een externe assembly
Met een IHostingStartup-implementatie kunt u verbeteringen aan een app toevoegen bij het opstarten vanuit een externe assembly buiten de Startup
klasse van de app. Zie Hosting-opstartassembly's gebruiken in ASP.NET Corevoor meer informatie.
Configuratiebindingsbrongenerator
De brongenerator voor configuratiebinding biedt een AOT- en trimvriendelijke configuratie. Zie configuratiebindingsbrongenerator voor meer informatie.
Aanvullende bronnen
Toepassingsconfiguratie in ASP.NET Core wordt uitgevoerd met behulp van een of meer configuratieproviders. Configuratieproviders lezen configuratiegegevens van sleutel-waardeparen met behulp van verschillende configuratiebronnen:
- Instellingenbestanden, zoals
appsettings.json
- Omgevingsvariabelen
- Azure Key Vault
- Azure App Configuration (Configuratie van Azure-apps)
- Opdrachtregelargumenten
- Aangepaste providers, geïnstalleerd of gemaakt
- Directorybestanden
- .NET-objecten in het geheugen
Dit artikel bevat informatie over de configuratie in ASP.NET Core. Zie .NET-configuratie voor meer informatie over het gebruik van configuratie in console-apps.
Toepassings- en hostconfiguratie
ASP.NET Core-apps een host configureren en starten. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. De ASP.NET Core-sjablonen maken een WebApplicationBuilder sjabloon die de host bevat. Hoewel sommige configuraties kunnen worden uitgevoerd in zowel de host als de toepassingsconfiguratieproviders, moet doorgaans alleen de configuratie die nodig is voor de host worden uitgevoerd in de hostconfiguratie.
Toepassingsconfiguratie is de hoogste prioriteit en wordt in de volgende sectie beschreven. Hostconfiguratie volgt de toepassingsconfiguratie en wordt beschreven in dit artikel.
Standaardbronnen voor toepassingsconfiguratie
ASP.NET Core-web-apps die zijn gemaakt met dotnet nieuwe of Visual Studio genereren de volgende code:
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialiseert een nieuw exemplaar van de WebApplicationBuilder-klasse met vooraf geconfigureerde standaardwaarden. De geïnitialiseerde WebApplicationBuilder
(builder
) biedt standaardconfiguratie voor de app in de volgende volgorde, van hoogste naar laagste prioriteit:
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen zonder voorvoegsel met behulp van de configuratieprovider voor omgevingsvariabelen zonder voorvoegsel.
-
Gebruikersgeheimen wanneer de app draait in de
Development
-omgeving. -
appsettings.{Environment}.json
met behulp van de JSON-configuratieprovider. Bijvoorbeeldappsettings.Production.json
enappsettings.Development.json
. - appsettings.json met de JSON-configuratieprovider.
- Een terugval naar de hostconfiguratie die wordt beschreven in de volgende sectie.
Standaardhostconfiguratiebronnen
De volgende lijst bevat de standaardhostconfiguratiebronnen van hoogste naar laagste prioriteit voor WebApplicationBuilder:
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider
- Omgevingsvariabelen die beginnen met
DOTNET_
met behulp van de configuratieprovider voor omgevingsvariabelen. - Omgevingsvariabelen die beginnen met
ASPNETCORE_
met behulp van de configuratieprovider voor omgevingsvariabelen.
Voor de .NET Generic Host en Web Host zijn de standaardhostconfiguratiebronnen van hoogste naar laagste prioriteit:
- Omgevingsvariabelen die beginnen met
ASPNETCORE_
met behulp van de configuratieprovider voor omgevingsvariabelen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider
- Omgevingsvariabelen die beginnen met
DOTNET_
met behulp van de configuratieprovider voor omgevingsvariabelen.
Wanneer een configuratiewaarde is ingesteld in de host- en toepassingsconfiguratie, wordt de toepassingsconfiguratie gebruikt.
Hostvariabelen
De volgende variabelen worden vroeg vergrendeld bij het initialiseren van de hostbuilders en kunnen niet worden beïnvloed door de configuratie van de toepassing:
- Toepassingsnaam
-
Omgevingsnaam, bijvoorbeeld
Development
,Production
enStaging
- Inhoudroot
- Webroot
- Of er moet worden gescand op hosting startassemblies en welke assemblies gescand moeten worden.
- Variabelen die worden gelezen door de app- en bibliotheekcode vanuit HostBuilderContext.Configuration in IHostBuilder.ConfigureAppConfiguration-callbacks.
Elke andere hostinstelling wordt gelezen uit de configuratie van de toepassing in plaats van de hostconfiguratie.
URLS
is een van de vele algemene hostinstellingen die geen bootstrap-instelling is. Net als elke andere hostinstelling die niet in de vorige lijst staat, URLS
wordt deze later gelezen uit de configuratie van de toepassing. Hostconfiguratie is een terugval voor toepassingsconfiguratie, dus hostconfiguratie kan worden gebruikt om in te stellen URLS
, maar deze wordt overschreven door elke configuratiebron in de configuratie van de toepassing, zoals appsettings.json
.
Zie De hoofdmap, app-naam en omgeving van deinhoud wijzigen en de inhoudshoofdmap, app-naam en omgeving wijzigen op omgevingsvariabelen of opdrachtregel voor meer informatie
De overige secties in dit artikel verwijzen naar toepassingsconfiguratie.
Toepassingsconfiguratieproviders
De volgende code geeft de ingeschakelde configuratieproviders weer in de volgorde waarin ze zijn toegevoegd:
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);
}
}
In de voorgaande lijst met standaardconfiguratiebronnen met de hoogste tot laagste prioriteit worden de providers weergegeven in de tegenovergestelde volgorde waarin ze worden toegevoegd aan de door de sjabloon gegenereerde toepassing. De JSON-configuratieprovider wordt bijvoorbeeld toegevoegd vóór de opdrachtregelconfiguratieprovider.
Configuratieproviders die later worden toegevoegd, hebben een hogere prioriteit en overschrijven eerdere sleutelinstellingen. Als MyKey
is ingesteld in zowel appsettings.json
als in de omgeving, wordt de waarde van de omgeving gebruikt. Met behulp van de standaardconfiguratieproviders overschrijft de opdrachtregelconfiguratieprovider alle andere providers.
Zie Instellingen voor standaardbouwer voor meer informatieCreateBuilder
.
appsettings.json
Houd rekening met het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
De standaardconfiguratie JsonConfigurationProvider wordt geladen in de volgende volgorde:
appsettings.json
-
appsettings.{Environment}.json
: bijvoorbeeld deappsettings.Production.json
enappsettings.Development.json
bestanden. De omgevingsversie van het bestand wordt geladen op basis van de IHostingEnvironment.EnvironmentName. Zie Meerdere omgevingen gebruiken in ASP.NET Core voor meer informatie.
appsettings.{Environment}.json
waarden overschrijven sleutels in appsettings.json
. Bijvoorbeeld, standaard:
- Tijdens ontwikkeling overschrijft
appsettings.Development.json
configuratiewaarden inappsettings.json
. - In productie overschrijft
appsettings.Production.json
configuratie de waarden inappsettings.json
. Bijvoorbeeld bij het implementeren van de app in Azure.
Als een configuratiewaarde moet worden gegarandeerd, raadpleegt u GetValue. In het voorgaande voorbeeld worden alleen tekenreeksen gelezen en wordt geen standaardwaarde ondersteund.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
bestand en het appsettings.{Environment}.json
bestand nadat de app gestart is, worden gelezen door JSON-configuratieprovider.
Opmerkingen in appsettings.json
Opmerkingen in appsettings.json
en appsettings.{Environment}.json
bestanden worden ondersteund met javaScript- of C#-stijlopmerkingen.
Hiërarchische configuratiegegevens binden met behulp van het optiespatroon
De voorkeursmethode voor het lezen van gerelateerde configuratiewaarden is het gebruik van het patroon opties. Bijvoorbeeld om de volgende configuratiewaarden te lezen:
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Maak de volgende PositionOptions
klasse:
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Een opties klasse:
- Moet niet-abstract zijn met een openbare parameterloze constructor.
- Alle openbare lees-schrijfeigenschappen van het type zijn gebonden.
- Velden zijn niet gebonden. In de voorgaande code,
Position
is niet gebonden. HetPosition
veld wordt gebruikt, zodat de tekenreeks"Position"
niet hard gecodeerd hoeft te worden in de app wanneer de klasse aan een configuratieprovider wordt gekoppeld.
De volgende code:
- Roept ConfigurationBinder.Bind aan om de
PositionOptions
klasse aan dePosition
sectie te binden. - Geeft de
Position
configuratiegegevens weer.
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
ConfigurationBinder.Get<T>
bindt en retourneert het opgegeven type.
ConfigurationBinder.Get<T>
kan handiger zijn dan het gebruik.ConfigurationBinder.Bind
De volgende code laat zien hoe u deze kunt gebruiken ConfigurationBinder.Get<T>
met de PositionOptions
klasse:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
Een alternatieve benadering bij het gebruik van het optiepatroon is om de Position
sectie te binden en toe te voegen aan de afhankelijkheidsinjectieservicecontainer. In de volgende code PositionOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
Met behulp van de voorgaande code leest de volgende code de positieopties:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand nadat de app is gestart, niet gelezen. Als u wijzigingen wilt lezen nadat de app is gestart, gebruikt u IOptionsSnapshot.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
bestand en het appsettings.{Environment}.json
bestand nadat de app gestart is, worden gelezen door JSON-configuratieprovider.
Zie de JSON-configuratieprovider in dit document voor informatie over het toevoegen van extra JSON-configuratiebestanden.
Serviceverzameling combineren
Houd rekening met het volgende waarmee services worden geregistreerd en opties worden geconfigureerd:
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();
Gerelateerde groepen registraties kunnen worden verplaatst naar een extensiemethode om services te registreren. De configuratieservices worden bijvoorbeeld toegevoegd aan de volgende klasse:
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;
}
}
}
De resterende services worden geregistreerd in een vergelijkbare klasse. De volgende code maakt gebruik van de nieuwe extensiemethoden om de services te registreren:
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Opmerking: Elke services.Add{GROUP_NAME}
extensiemethode voegt services toe en configureert deze mogelijk.
AddControllersWithViews voegt bijvoorbeeld de services toe die vereist zijn door MVC-controllers met weergaven, en AddRazorPages voegt de services toe die vereist zijn door Razor Pagina's.
Beveiligings- en gebruikersgeheimen
Richtlijnen voor configuratiegegevens:
- Sla nooit wachtwoorden of andere gevoelige gegevens op in configuratieprovidercode of in configuratiebestanden met tekst zonder opmaak. Het hulpprogramma Secret Manager kan worden gebruikt om geheimen voor ontwikkelingsdoeleinden op te slaan.
- Gebruik geen productiegeheimen in ontwikkel- of testomgevingen.
- Geef geheimen buiten het project op, zodat ze niet per ongeluk kunnen worden doorgevoerd in een opslagplaats met broncode.
- Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromen voor meer informatie.
Standaard wordt de configuratiebron voor gebruikersgeheimen geregistreerd na de JSON-configuratiebronnen. Daarom hebben gebruikersgeheimsleutels voorrang op sleutels in appsettings.json
en appsettings.{Environment}.json
.
Voor meer informatie over het opslaan van wachtwoorden of andere gevoelige gegevens:
- Meerdere omgevingen gebruiken in ASP.NET Core
- Veilige opslag van app-geheimen in ontwikkeling in ASP.NET Core: bevat advies over het gebruik van omgevingsvariabelen voor het opslaan van gevoelige gegevens. Het hulpprogramma Secret Manager gebruikt de bestandsconfiguratieprovider om gebruikersgeheimen op te slaan in een JSON-bestand op het lokale systeem.
Azure Key Vault slaat app-geheimen veilig op voor ASP.NET Core-apps. Zie de Azure Key Vault-configuratieprovider in ASP.NET Core voor meer informatie.
Omgevingsvariabelen zonder voorvoegsel
Omgevingsvariabelen zonder voorvoegsel zijn andere omgevingsvariabelen dan omgevingsvariabelen die zijn voorafgegaan door ASPNETCORE_
of DOTNET_
. Bijvoorbeeld, de sjablonen voor ASP.NET Core-webtoepassingen stellen "ASPNETCORE_ENVIRONMENT": "Development"
in launchSettings.json
in. Zie voor meer informatie over ASPNETCORE_
en DOTNET_
omgevingsvariabelen:
-
Lijst met standaardconfiguratiebronnen van hoogste tot laagste prioriteit waaronder niet-geprefixeerde,
ASPNETCORE_
-geprefixeerde enDOTNETCORE_
-geprefixeerde omgevingsvariabelen. -
DOTNET_
omgevingsvariabelen die buiten Microsoft.Extensions.Hosting worden gebruikt.
Met behulp van de standaardconfiguratie laadt de EnvironmentVariablesConfigurationProvider configuratie van sleutel-waardeparen van de omgevingsvariabele na het lezenappsettings.json
appsettings.{Environment}.json
, en gebruikersgeheimen. Sleutelwaarden die uit de omgeving worden gelezen, overschrijven daarom waarden uit appsettings.json
, appsettings.{Environment}.json
en gebruikersgeheimen.
Het :
-scheidingsteken werkt niet met hiërarchische sleutels van omgevingsvariabelen op alle platformen. Het :
-scheidingsteken wordt bijvoorbeeld niet ondersteund door Bash. Het dubbele onderstrepingsteken, __
, is:
- Ondersteund door alle platforms.
- Automatisch vervangen door dubbelpunt,
:
.
De volgende set
opdrachten:
- Stel de omgevingssleutels en -waarden in van het voorgaande voorbeeld in Windows.
- Test de instellingen bij het gebruik van het voorbeelddownload. De
dotnet run
opdracht moet worden uitgevoerd in de projectmap.
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
De voorgaande omgevingsinstellingen:
- Worden alleen ingesteld in processen die zijn gestart vanuit het opdrachtvenster waarin ze zijn ingesteld.
- Wordt niet gelezen door browsers die zijn gestart met Visual Studio.
De volgende setx-opdrachten kunnen worden gebruikt om de omgevingssleutels en -waarden in Windows in te stellen. In tegenstelling tot set
, setx
instellingen blijven behouden.
/M
stelt de variabele in de systeemomgeving in. Als de /M
switch niet wordt gebruikt, wordt een gebruikersomgevingsvariabele ingesteld.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Testen of de voorgaande opdrachten appsettings.json
en appsettings.{Environment}.json
overschrijven:
- Met Visual Studio: Visual Studio afsluiten en opnieuw starten.
- Met de CLI: Start een nieuw opdrachtvenster en voer dit in
dotnet run
.
Roep AddEnvironmentVariables een tekenreeks aan om een voorvoegsel voor omgevingsvariabelen op te geven:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
In de voorgaande code:
-
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
wordt toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider. - Omgevingsvariabelen die zijn ingesteld met het
MyCustomPrefix_
voorvoegsel overschrijven de standaardconfiguratieproviders. Dit omvat omgevingsvariabelen zonder het voorvoegsel.
Het voorvoegsel wordt verwijderd wanneer de configuratiesleutel-waardeparen worden gelezen.
Met de volgende opdrachten wordt het aangepaste voorvoegsel getest:
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
De standaardconfiguratie laadt omgevingsvariabelen en opdrachtregelargumenten voorafgegaan door DOTNET_
en ASPNETCORE_
. De DOTNET_
en ASPNETCORE_
voorvoegsels worden gebruikt door ASP.NET Core voor host- en app-configuratie, maar niet voor gebruikersconfiguratie. Zie .NET Generic Host voor meer informatie over host- en app-configuratie.
Selecteer op Azure-app Service de optie Nieuwe toepassingsinstelling Azure-app servicetoepassingsinstellingen zijn:
- Versleuteld at-rest en verzonden via een versleuteld kanaal.
- Weergegeven als omgevingsvariabelen.
Zie Azure Apps: App-configuratie overschrijven met behulp van Azure Portal voor meer informatie.
Zie verbindingsreeksvoorvoegsels voor informatie over Verbindingsreeksen in Azure Database.
Naamgeving van omgevingsvariabelen
Namen van omgevingsvariabelen weerspiegelen de structuur van een appsettings.json
bestand. Elk element in de hiërarchie wordt gescheiden door een dubbele onderstrepingsteken (bij voorkeur) of een dubbele punt. Wanneer de elementstructuur een matrix bevat, moet de matrixindex worden behandeld als een extra elementnaam in dit pad. Houd rekening met het volgende appsettings.json
bestand en de bijbehorende equivalente waarden die worden weergegeven als omgevingsvariabelen.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Omgevingsvariabelen
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
Omgevingsvariabelen die zijn ingesteld in gegenereerde launchSettings.json
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving. De ASP.NET Core-websjablonen genereren bijvoorbeeld een launchSettings.json
bestand waarmee de eindpuntconfiguratie wordt ingesteld op:
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Door de applicationUrl
te configureren, wordt de ASPNETCORE_URLS
omgevingsvariabele ingesteld en worden waarden in de omgeving overschreven.
Omgevingsvariabelen ontsnappen in Linux
Op Linux moeten de waarden van URL-omgevingsvariabelen worden geëscaped zodat systemd
deze kan parsen. Gebruik de Linux-tool systemd-escape
die http:--localhost:5001
oplevert
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Omgevingsvariabelen weergeven
In de volgende code worden de omgevingsvariabelen en -waarden weergegeven bij het opstarten van toepassingen. Dit kan handig zijn bij het opsporen van fouten in de omgevingsinstellingen:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
Opdrachtregel
Met behulp van de standaardconfiguratie laadt de CommandLineConfigurationProvider de configuratie, van sleutel-waardekoppels van opdrachtregelargumenten, na de volgende configuratiebronnen:
-
appsettings.json
enappsettings.{Environment}.json
bestanden. - App-geheimen in de ontwikkelomgeving.
- Omgevingsvariabelen.
Standaard worden configuratiewaarden die zijn ingesteld op de opdrachtregel configuratiewaarden vervangen die zijn ingesteld bij alle andere configuratieproviders.
Opdrachtregelargumenten
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
De sleutelwaarde:
- Moet volgen
=
of de sleutel moet een voorvoegsel hebben van--
of/
wanneer de waarde een spatie volgt. - Is niet vereist als
=
deze wordt gebruikt. Bijvoorbeeld:MySetting=
.
Combineer binnen dezelfde opdracht geen sleutel-waardeparen met opdrachtregelargumenten die worden gebruikt =
met sleutel-waardeparen die gebruikmaken van een spatie.
Switchtoewijzingen
Schakelmappingen staan vervangingslogica voor sleutelnamen toe. Geef een woordenlijst op met switchvervangingen voor de AddCommandLine methode.
Wanneer het woordenboek voor switchtoewijzingen wordt gebruikt, wordt het woordenboek gecontroleerd op een sleutel die overeenkomt met de sleutel die door een opdrachtregelargument wordt geleverd. Als de opdrachtregelsleutel wordt gevonden in de woordenlijst, wordt de waarde van de woordenlijst teruggegeven om het sleutel-waardepaar in te stellen in de configuratie van de app. Een switchtoewijzing is vereist voor elke opdrachtregelsleutel die wordt voorafgegaan door één streepje (-
).
Regels voor sleutels van schakelmappings in woordenboeken:
- Schakelopties moeten beginnen met
-
of--
. - De woordenlijst voor switchtoewijzingen mag geen dubbele sleutels bevatten.
Als u een woordenlijst voor switchtoewijzingen wilt gebruiken, geeft u deze door bij de aanroep van 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();
Voer de volgende opdracht uit om de sleutelvervanging te testen:
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
De volgende code toont de sleutelwaarden voor de vervangen sleutels:
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"]}'");
}
}
Voor apps die switchtoewijzingen gebruiken, mag de aanroep geen argumenten doorgeven. De CreateDefaultBuilder
aanroep van AddCommandLine
de methode bevat geen toegewezen switches en er is geen manier om de woordenlijst voor switchtoewijzing door te geven aan CreateDefaultBuilder
. De oplossing is niet om de argumenten door te geven aanCreateDefaultBuilder
, maar in plaats daarvan de methode van AddCommandLine
de ConfigurationBuilder
methode toe te staan zowel de argumenten als de woordenlijst voor switchtoewijzing te verwerken.
Omgevings- en opdrachtregelargumenten instellen met Visual Studio
Omgevings- en opdrachtregelargumenten kunnen in Visual Studio worden ingesteld vanuit het dialoogvenster Opstartprofielen:
- Klik in Solution Explorer met de rechtermuisknop op het project en selecteer Eigenschappen.
- Selecteer het tabblad Foutopsporings > algemeen en selecteer de gebruikersinterface voor het openen van startprofielen voor foutopsporing.
Hiërarchische configuratiegegevens
De configuratie-API leest hiërarchische configuratiegegevens door de hiërarchische gegevens plat te maken met behulp van een scheidingsteken in de configuratiesleutels.
Het voorbeelddownload bevat het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code van het voorbeelddownload worden verschillende configuratie-instellingen weergegeven:
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}");
}
}
De voorkeursmethode voor het lezen van hiërarchische configuratiegegevens is het gebruik van het optiespatroon. Zie Hiërarchische bindingsconfiguratiegegevens in dit document voor meer informatie.
GetSection en GetChildren methoden zijn beschikbaar om secties en onderliggende elementen van een sectie in de configuratiegegevens te isoleren. Deze methoden worden verderop beschreven in GetSection, GetChildren en Exists.
Configuratiesleutels en -waarden
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
Configuratiesleutels:
- Zijn niet hoofdlettergevoelig.
ConnectionString
enconnectionstring
worden bijvoorbeeld behandeld als gelijkwaardige sleutels. - Als een sleutel en waarde zijn ingesteld in meer dan één configuratieprovider, wordt de waarde van de laatste toegevoegde provider gebruikt. Zie De standaardconfiguratie voor meer informatie.
- Hiërarchische sleutels
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
:
) op alle platforms. - In omgevingsvariabelen werkt een dubbele punt als scheidingsteken mogelijk niet op alle platforms. Een dubbele onderstrepingsteken,
__
, wordt ondersteund door alle platforms en wordt automatisch omgezet naar een dubbelpunt:
. - In Azure Key Vault gebruiken hiërarchische sleutels
--
als scheidingsteken. De Azure Key Vault-configuratieprovider vervangt automatisch--
door een:
wanneer de geheimen in de configuratie van de app worden geladen.
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
- De ConfigurationBinder functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Matrixbinding wordt beschreven in de matrix binden aan een klassesectie .
Configuratiewaarden:
- Dit zijn tekenreeksen.
- Null-waarden kunnen niet worden opgeslagen in de configuratie of gebonden aan objecten.
Configuratieproviders
In de volgende tabel ziet u de configuratieproviders die beschikbaar zijn voor ASP.NET Core-apps.
Aanbieder | Zorgt voor configuratie vanuit |
---|---|
Azure Key Vault-configuratieprovider | Azure Key Vault |
Azure-app-configuratieprovider | Azure App Configuration (Configuratie van Azure-apps) |
Commandoregelconfiguratieprovider | Opdrachtregelparameters |
aangepaste configuratieprovider | Aangepaste bron |
configuratieprovider voor omgevingsvariabelen | Omgevingsvariabelen |
bestandsconfiguratieprovider | INI-, JSON- en XML-bestanden |
nl-NL: Sleutel-per-bestand-configuratieprovider | Directorybestanden |
geheugenconfiguratieprovider | Verzamelingen in het geheugen |
Gebruikersgeheimen | Het bestand in de gebruikersprofielmap |
Configuratiebronnen worden gelezen in de volgorde waarin hun configuratieproviders worden opgegeven. Rangschik configuratieproviders in de code volgens de prioriteiten voor de configuratiebronnen die de app nodig heeft.
Een typische reeks configuratieproviders is:
appsettings.json
appsettings.{Environment}.json
- Gebruikersgeheimen
- Omgevingsvariabelen met behulp van de configuratieprovider Omgevingsvariabelen .
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
Een veelvoorkomende procedure is om de opdrachtregelconfiguratieprovider voor het laatst toe te voegen in een reeks providers om opdrachtregelargumenten toe te staan om de configuratie die door de andere providers is ingesteld, te overschrijven.
De voorgaande reeks providers wordt gebruikt in de standaardconfiguratie.
Verbindingsreeksvoorvoegsels
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
De configuratie-API heeft speciale verwerkingsregels voor vier verbindingsreeks omgevingsvariabelen. Deze verbindingsreeks zijn betrokken bij het configureren van Azure-verbindingsreeks s voor de app-omgeving. Omgevingsvariabelen met de voorvoegsels die in de tabel worden weergegeven, worden in de app geladen met de standaardconfiguratie of wanneer er geen voorvoegsel wordt opgegeven aan AddEnvironmentVariables
.
Verbindingsreeksvoorvoegsel | Aanbieder |
---|---|
CUSTOMCONNSTR_ |
Aangepaste leverancier |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Wanneer een omgevingsvariabele wordt gedetecteerd en in de configuratie wordt geladen met een van de vier voorvoegsels die in de tabel worden weergegeven:
- De configuratiesleutel wordt gemaakt door het voorvoegsel van de omgevingsvariabele te verwijderen en een sectie met een configuratiesleutel (
ConnectionStrings
) toe te voegen. - Er wordt een nieuw sleutel-waardepaar voor de configuratie gemaakt dat de databaseverbindingsprovider vertegenwoordigt (met uitzondering van
CUSTOMCONNSTR_
, waarvoor geen vermelde provider is opgegeven).
Sleutel voor omgevingsvariabele | Geconverteerde configuratiesleutel | Providerconfiguratie-vermelding |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Configuratievermelding niet gemaakt. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
Bestandsconfiguratieprovider
FileConfigurationProvider is de basisklasse voor het laden van de configuratie van het bestandssysteem. De volgende configuratieproviders zijn afgeleid van FileConfigurationProvider
:
INI-configuratieprovider
De IniConfigurationProvider laadt tijdens runtime configuratie vanuit INI-bestandssleutel-waardeparen.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyIniConfig.ini
en MyIniConfig.{Environment}.ini
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyIniConfig.ini
bestand:
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
JSON-configuratieprovider
De JsonConfigurationProvider laadt de configuratie vanuit de sleutel-waardeparen van het JSON-bestand.
Overbelastingen kunnen het volgende opgeven:
- Of het bestand optioneel is.
- Of de configuratie opnieuw wordt geladen als het bestand wordt gewijzigd.
Houd rekening met de volgende code:
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();
De voorgaande code:
- Hiermee configureert u de JSON-configuratieprovider om het
MyConfig.json
bestand te laden met de volgende opties:-
optional: true
: Het bestand is optioneel. -
reloadOnChange: true
: het bestand wordt opnieuw geladen wanneer wijzigingen worden opgeslagen.
-
- Leest de standaardconfiguratieproviders vóór het
MyConfig.json
bestand. Instellingen in deMyConfig.json
instelling voor het overschrijven van bestanden in de standaardconfiguratieproviders, waaronder de configuratieprovider voor omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
Normaal gesproken wilt u geen aangepast JSON-bestand dat waarden overschrijft die zijn ingesteld in de configuratieprovider omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
XML-configuratieprovider
De XmlConfigurationProvider configuratie wordt tijdens runtime geladen van sleutel-waardeparen van XML-bestanden.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyXMLFile.xml
en MyXMLFile.{Environment}.xml
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyXMLFile.xml
bestand:
<?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>
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
Herhalende elementen die dezelfde elementnaam gebruiken, werken als het name
kenmerk wordt gebruikt om de elementen te onderscheiden:
<?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>
De volgende code leest het vorige configuratiebestand en geeft de sleutels en waarden weer:
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"
);
}
}
Kenmerken kunnen worden gebruikt om waarden op te geven:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
In het vorige configuratiebestand worden de volgende sleutels geladen met value
:
- key:attribute
- section:key:attribute
Configuratieprovider voor sleutel per bestand
De KeyPerFileConfigurationProvider map maakt gebruik van de bestanden van een map als configuratiesleutel-waardeparen. De sleutel is de bestandsnaam. De waarde bevat de inhoud van het bestand. De key-per-file-configuratieprovider wordt gebruikt in Docker-hostingscenario's.
Als u key-per-file-configuratie wilt activeren, roept u de AddKeyPerFile extensiemethode aan op een exemplaar van ConfigurationBuilder. De directoryPath
bestanden moeten een absoluut pad zijn.
Overbelastingen maken het opgeven van:
- Een
Action<KeyPerFileConfigurationSource>
gemachtigde die de bron configureert. - Of de map optioneel is en of het pad naar de map is.
Het dubbele onderstrepingsteken (__
) wordt gebruikt als scheidingsteken voor configuratiesleutels in bestandsnamen. De bestandsnaam Logging__LogLevel__System
produceert bijvoorbeeld de configuratiesleutel Logging:LogLevel:System
.
Aanroepen ConfigureAppConfiguration
bij het bouwen van de host om de configuratie van de app op te geven:
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Geheugenconfiguratieprovider
Hierbij MemoryConfigurationProvider wordt een verzameling in het geheugen gebruikt als configuratiesleutel-waardeparen.
Met de volgende code wordt een geheugenverzameling toegevoegd aan het configuratiesysteem:
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();
In de volgende code van het voorbeelddownload worden de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
In de voorgaande code config.AddInMemoryCollection(Dict)
wordt deze toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider.
Zie Een matrix binden voor een ander voorbeeld met behulp van MemoryConfigurationProvider
.
Kestrel eindpuntconfiguratie
Kestrel specifieke eindpuntconfiguratie overschrijft alle serveroverschrijdende eindpuntconfiguraties. Configuraties voor eindpunten tussen servers zijn onder andere:
- UseUrls
-
--urls
op de commandoregel - De omgevingsvariabele
ASPNETCORE_URLS
Houd rekening met het volgende appsettings.json
bestand dat wordt gebruikt in een ASP.NET Core-web-app:
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Wanneer de voorgaande gemarkeerde markering wordt gebruikt in een ASP.NET Core-web-app en de app wordt gestart op de opdrachtregel met de volgende server-overschrijdende eindpuntconfiguratie:
dotnet run --urls="https://localhost:7777"
Kestrel verbindt met het eindpunt dat specifiek is geconfigureerd voor Kestrel in het appsettings.json
bestand (https://localhost:9999
) en niet https://localhost:7777
.
Overweeg het Kestrel specifieke eindpunt dat is geconfigureerd als een omgevingsvariabele:
set Kestrel__Endpoints__Https__Url=https://localhost:8888
In de voorgaande omgevingsvariabele Https
is dit de naam van het Kestrel specifieke eindpunt. Het voorgaande appsettings.json
bestand definieert ook een specifiek eindpunt met de Kestrel naam Https
. Standaard wordt de omgevingsvariabele die gebruikmaakt van de configuratieprovider Omgevingsvariabelen gelezen nadat appsettings.{Environment}.json
, daarom wordt de voorgaande omgevingsvariabele gebruikt voor het Https
eindpunt.
WaardeOphalen
ConfigurationBinder.GetValue extraheert één waarde uit de configuratie met een opgegeven sleutel en converteert deze naar het opgegeven type:
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}");
}
}
In de voorgaande code, als NumberKey
niet in de configuratie wordt gevonden, wordt de standaardwaarde 99
gebruikt.
GetSection, GetChildren en Exists
Bekijk het volgende MySubsection.json
bestand voor de volgende voorbeelden:
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
De volgende code voegt MySubsection.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
GetSection
IConfiguration.GetSection retourneert een configuratiesubsectie met de opgegeven subsectiesleutel.
De volgende code retourneert waarden voor 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"]}'");
}
}
De volgende code retourneert waarden voor 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
keert null
nooit terug. Als er geen overeenkomende sectie wordt gevonden, wordt een lege IConfigurationSection
sectie geretourneerd.
Wanneer GetSection
een overeenkomende sectie retourneert, wordt Value niet ingevuld.
Key en Path worden geretourneerd wanneer de sectie bestaat.
GetChildren and Exists
De volgende code roept IConfiguration.GetChildren waarden aan en retourneert waarden voor 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);
}
}
De voorgaande code aanroepen ConfigurationExtensions.Exists om te controleren of de sectie bestaat:
Een matrix binden
De ConfigurationBinder.Bind functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Elke matrixindeling die een numeriek sleutelsegment beschikbaar maakt, kan matrixbindingen uitvoeren op een POCO-klassematrix .
Houd rekening met MyArray.json
uit de voorbeeld-download:
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
De volgende code voegt MyArray.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Met de volgende code wordt de configuratie gelezen en worden de waarden weergegeven:
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; }
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
In de voorgaande uitvoer heeft Index 3 een waarde value40
die overeenkomt met "4": "value40",
in MyArray.json
. De afhankelijke matrixindexen zijn doorlopend en zijn niet gebonden aan de configuratiesleutelindex. De configuratiebinding kan geen null-waarden binden of null-vermeldingen maken in afhankelijke objecten.
Aangepaste configuratieprovider
De voorbeeld-app laat zien hoe u een eenvoudige configuratieprovider maakt die configuratiesleutel-waardeparen van een database leest met behulp van Entity Framework (EF).
De provider heeft de volgende kenmerken:
- De EF-database in het geheugen wordt gebruikt voor demonstratiedoeleinden. Als u een database wilt gebruiken waarvoor een verbindingsreeks is vereist, implementeert u een secundaire
ConfigurationBuilder
om de verbindingsreeks van een andere configuratieprovider op te geven. - De provider leest een databasetabel in de configuratie bij het opstarten. De provider doorzoekt de database niet per sleutel.
- Reload-on-change is niet geïmplementeerd, dus het bijwerken van de database nadat de app is gestart, heeft geen invloed op de configuratie van de app.
Definieer een EFConfigurationValue
entiteit voor het opslaan van configuratiewaarden in de database.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Voeg een EFConfigurationContext
toe om de geconfigureerde waarden op te slaan en te openen.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Maak een klasse die IConfigurationSource implementeert.
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);
}
Maak de aangepaste configuratieprovider door deze over te nemen van ConfigurationProvider. De configuratieprovider initialiseert de database wanneer deze leeg is. Omdat configuratiesleutels niet hoofdlettergevoelig zijn, wordt de woordenlijst die wordt gebruikt om de database te initialiseren gemaakt met de niet-hoofdlettergevoelige vergelijking (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;
}
}
Met een AddEFConfiguration
extensiemethode kan de configuratiebron worden toegevoegd aan een ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
De volgende code laat zien hoe u de aangepaste EFConfigurationProvider
code gebruikt in Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
Toegangsconfiguratie met afhankelijkheidsinjectie (DI)
Configuratie kan worden geïnjecteerd in services met behulp van afhankelijkheidsinjectie (DI) door de service IConfiguration op te lossen.
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Zie voor informatie over hoe u waarden kunt benaderen met behulp van IConfiguration
, GetValue en GetSection, GetChildren en Exists in dit artikel.
Configuratie voor toegang in Razor Pagina's
De volgende code geeft configuratiegegevens weer op een Razor pagina:
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
In de volgende code MyOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
In de volgende markeringen wordt de @inject
Razor instructie gebruikt om de waarde van de opties op te lossen en weer te geven:
@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>
Toegangsconfiguratie in een MVC-weergavebestand
De volgende code geeft configuratiegegevens weer in een MVC-weergave:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Toegangsconfiguratie in Program.cs
De volgende code heeft toegang tot de configuratie in het Program.cs
bestand.
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();
In appsettings.json
het voorgaande voorbeeld:
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Opties configureren met een gemachtigde
Opties die zijn geconfigureerd in een delegaat, overschrijven waarden die zijn ingesteld in de configuratieproviders.
In de volgende code wordt een IConfigureOptions<TOptions> service toegevoegd aan de servicecontainer. Er wordt een gemachtigde gebruikt om waarden te configureren voor 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();
In de volgende code worden de optieswaarden weergegeven:
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}");
}
}
In het voorgaande voorbeeld worden de waarden van Option1
en Option2
opgegeven in appsettings.json
en vervolgens overschreven door de geconfigureerde gemachtigde.
Host versus app-configuratie
Voordat de app is geconfigureerd en gestart, wordt een host geconfigureerd en gestart. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. Zowel de app als de host worden geconfigureerd met behulp van de configuratieproviders die in dit onderwerp worden beschreven. Hostconfiguratiesleutel-waardeparen worden ook opgenomen in de configuratie van de app. Zie voor meer informatie over hoe de configuratieproviders worden gebruikt wanneer de host wordt gebouwd en hoe configuratiebronnen van invloed zijn op de hostconfiguratie ASP.NET overzicht van basisbeginselen.
Standaardhostconfiguratie
Zie de ASP.NET Core 2.2-versie van dit onderwerp voor meer informatie over de standaardconfiguratie wanneer u de webhost gebruikt.
- Hostconfiguratie wordt geleverd van:
- Omgevingsvariabelen voorafgegaan door
DOTNET_
(bijvoorbeeldDOTNET_ENVIRONMENT
) met behulp van de configuratieprovider Omgevingsvariabelen. Het voorvoegsel (DOTNET_
) wordt verwijderd wanneer de configuratiesleutel-waardeparen worden geladen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen voorafgegaan door
- De standaardconfiguratie van de webhost is ingesteld (
ConfigureWebHostDefaults
):- Kestrel wordt gebruikt als de webserver en geconfigureerd met behulp van de configuratieproviders van de app.
- Voeg middleware voor het filteren van hosts toe.
- Voeg Forwarded Headers-middleware toe als de
ASPNETCORE_FORWARDEDHEADERS_ENABLED
omgevingsvariabele is gesteld optrue
. - IIS-integratie inschakelen.
Andere configuratie
Dit onderwerp heeft alleen betrekking op app-configuratie. Andere aspecten van het uitvoeren en hosten van ASP.NET Core-apps worden geconfigureerd met behulp van configuratiebestanden die niet in dit onderwerp worden behandeld:
-
launch.json
/launchSettings.json
zijn configuratiebestanden voor tooling in de ontwikkelomgeving, beschreven:- In Gebruik meerdere omgevingen in ASP.NET Core.
- In de documentatieset waarin de bestanden worden gebruikt voor het configureren van ASP.NET Core-apps voor ontwikkelingsscenario's.
-
web.config
is een serverconfiguratiebestand dat wordt beschreven in de volgende onderwerpen:
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving.
Zie Configuratie migreren naar ASP.NET Core voor meer informatie over het migreren van app-configuratie van eerdere versies van ASP.NET.
Configuratie toevoegen vanuit een externe assembly
Met een IHostingStartup-implementatie kunt u verbeteringen aan een app toevoegen bij het opstarten vanuit een externe assembly buiten de Startup
klasse van de app. Zie Hosting-opstartassembly's gebruiken in ASP.NET Corevoor meer informatie.
Aanvullende bronnen
Toepassingsconfiguratie in ASP.NET Core wordt uitgevoerd met behulp van een of meer configuratieproviders. Configuratieproviders lezen configuratiegegevens van sleutel-waardeparen met behulp van verschillende configuratiebronnen:
- Instellingenbestanden, zoals
appsettings.json
- Omgevingsvariabelen
- Azure Key Vault
- Azure App Configuration (Configuratie van Azure-apps)
- Opdrachtregelargumenten
- Aangepaste providers, geïnstalleerd of gemaakt
- Directorybestanden
- .NET-objecten in het geheugen
Dit artikel bevat informatie over de configuratie in ASP.NET Core. Zie .NET-configuratie voor meer informatie over het gebruik van configuratie in console-apps.
Toepassings- en hostconfiguratie
ASP.NET Core-apps een host configureren en starten. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. De ASP.NET Core-sjablonen maken een WebApplicationBuilder sjabloon die de host bevat. Hoewel sommige configuraties kunnen worden uitgevoerd in zowel de host als de toepassingsconfiguratieproviders, moet doorgaans alleen de configuratie die nodig is voor de host worden uitgevoerd in de hostconfiguratie.
Toepassingsconfiguratie is de hoogste prioriteit en wordt in de volgende sectie beschreven. Hostconfiguratie volgt de toepassingsconfiguratie en wordt beschreven in dit artikel.
Standaardbronnen voor toepassingsconfiguratie
ASP.NET Core-web-apps die zijn gemaakt met dotnet nieuwe of Visual Studio genereren de volgende code:
var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder initialiseert een nieuw exemplaar van de WebApplicationBuilder-klasse met vooraf geconfigureerde standaardwaarden. De geïnitialiseerde WebApplicationBuilder
(builder
) biedt standaardconfiguratie voor de app in de volgende volgorde, van hoogste naar laagste prioriteit:
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen zonder voorvoegsel met behulp van de configuratieprovider voor omgevingsvariabelen zonder voorvoegsel.
-
Gebruikersgeheimen wanneer de app draait in de
Development
-omgeving. -
appsettings.{Environment}.json
met behulp van de JSON-configuratieprovider. Bijvoorbeeldappsettings.Production.json
enappsettings.Development.json
. - appsettings.json met de JSON-configuratieprovider.
- Een terugval naar de hostconfiguratie die wordt beschreven in de volgende sectie.
Standaardhostconfiguratiebronnen
De volgende lijst bevat de standaardhostconfiguratiebronnen van hoogste naar laagste prioriteit:
- Omgevingsvariabelen die beginnen met
ASPNETCORE_
met behulp van de configuratieprovider voor omgevingsvariabelen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider
- Omgevingsvariabelen die beginnen met
DOTNET_
met behulp van de configuratieprovider voor omgevingsvariabelen.
Wanneer een configuratiewaarde is ingesteld in de host- en toepassingsconfiguratie, wordt de toepassingsconfiguratie gebruikt.
Zie Uitleg in deze GitHub-opmerking voor een uitleg van waarom in hostconfiguratie, ASPNETCORE_
voorvoegsel omgevingsvariabelen een hogere prioriteit hebben dan opdrachtregelargumenten.
Hostvariabelen
De volgende variabelen worden vroeg vergrendeld bij het initialiseren van de hostbuilders en kunnen niet worden beïnvloed door de configuratie van de toepassing:
- Toepassingsnaam
-
Omgevingsnaam, bijvoorbeeld
Development
,Production
enStaging
- Inhoudroot
- Webroot
- Of er moet worden gescand op hosting startassemblies en welke assemblies gescand moeten worden.
- Variabelen die worden gelezen door de app- en bibliotheekcode vanuit HostBuilderContext.Configuration in IHostBuilder.ConfigureAppConfiguration-callbacks.
Elke andere hostinstelling wordt gelezen uit de configuratie van de toepassing in plaats van de hostconfiguratie.
URLS
is een van de vele algemene hostinstellingen die geen bootstrap-instelling is. Net als elke andere hostinstelling die niet in de vorige lijst staat, URLS
wordt deze later gelezen uit de configuratie van de toepassing. Hostconfiguratie is een terugval voor toepassingsconfiguratie, dus hostconfiguratie kan worden gebruikt om in te stellen URLS
, maar deze wordt overschreven door elke configuratiebron in de configuratie van de toepassing, zoals appsettings.json
.
Zie De hoofdmap, app-naam en omgeving van deinhoud wijzigen en de inhoudshoofdmap, app-naam en omgeving wijzigen op omgevingsvariabelen of opdrachtregel voor meer informatie
De overige secties in dit artikel verwijzen naar toepassingsconfiguratie.
Toepassingsconfiguratieproviders
De volgende code geeft de ingeschakelde configuratieproviders weer in de volgorde waarin ze zijn toegevoegd:
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);
}
}
In de voorgaande lijst met standaardconfiguratiebronnen met de hoogste tot laagste prioriteit worden de providers weergegeven in de tegenovergestelde volgorde waarin ze worden toegevoegd aan de door de sjabloon gegenereerde toepassing. De JSON-configuratieprovider wordt bijvoorbeeld toegevoegd vóór de opdrachtregelconfiguratieprovider.
Configuratieproviders die later worden toegevoegd, hebben een hogere prioriteit en overschrijven eerdere sleutelinstellingen. Als MyKey
is ingesteld in zowel appsettings.json
als in de omgeving, wordt de waarde van de omgeving gebruikt. Met behulp van de standaardconfiguratieproviders overschrijft de opdrachtregelconfiguratieprovider alle andere providers.
Zie Instellingen voor standaardbouwer voor meer informatieCreateBuilder
.
appsettings.json
Houd rekening met het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
De standaardconfiguratie JsonConfigurationProvider wordt geladen in de volgende volgorde:
appsettings.json
-
appsettings.{Environment}.json
: bijvoorbeeld deappsettings.Production.json
enappsettings.Development.json
bestanden. De omgevingsversie van het bestand wordt geladen op basis van de IHostingEnvironment.EnvironmentName. Zie Meerdere omgevingen gebruiken in ASP.NET Core voor meer informatie.
appsettings.{Environment}.json
waarden overschrijven sleutels in appsettings.json
. Bijvoorbeeld, standaard:
- Tijdens ontwikkeling overschrijft
appsettings.Development.json
configuratiewaarden inappsettings.json
. - In productie overschrijft
appsettings.Production.json
configuratie de waarden inappsettings.json
. Bijvoorbeeld bij het implementeren van de app in Azure.
Als een configuratiewaarde moet worden gegarandeerd, raadpleegt u GetValue. In het voorgaande voorbeeld worden alleen tekenreeksen gelezen en wordt geen standaardwaarde ondersteund.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
bestand en het appsettings.{Environment}.json
bestand nadat de app gestart is, worden gelezen door JSON-configuratieprovider.
Hiërarchische configuratiegegevens binden met behulp van het optiespatroon
De voorkeursmethode voor het lezen van gerelateerde configuratiewaarden is het gebruik van het patroon opties. Bijvoorbeeld om de volgende configuratiewaarden te lezen:
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
Maak de volgende PositionOptions
klasse:
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
Een opties klasse:
- Moet niet-abstract zijn met een openbare parameterloze constructor.
- Alle openbare lees-schrijfeigenschappen van het type zijn gebonden.
- Velden zijn niet gebonden. In de voorgaande code,
Position
is niet gebonden. HetPosition
veld wordt gebruikt, zodat de tekenreeks"Position"
niet hard gecodeerd hoeft te worden in de app wanneer de klasse aan een configuratieprovider wordt gekoppeld.
De volgende code:
- Roept ConfigurationBinder.Bind aan om de
PositionOptions
klasse aan dePosition
sectie te binden. - Geeft de
Position
configuratiegegevens weer.
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
ConfigurationBinder.Get<T>
bindt en retourneert het opgegeven type.
ConfigurationBinder.Get<T>
kan handiger zijn dan het gebruik.ConfigurationBinder.Bind
De volgende code laat zien hoe u deze kunt gebruiken ConfigurationBinder.Get<T>
met de PositionOptions
klasse:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand standaard gelezen nadat de app is gestart.
Een alternatieve benadering bij het gebruik van het optiepatroon is om de Position
sectie te binden en toe te voegen aan de afhankelijkheidsinjectieservicecontainer. In de volgende code PositionOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
Met behulp van de voorgaande code leest de volgende code de positieopties:
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}");
}
}
In de voorgaande code worden wijzigingen in het JSON-configuratiebestand nadat de app is gestart, niet gelezen. Als u wijzigingen wilt lezen nadat de app is gestart, gebruikt u IOptionsSnapshot.
Met behulp van de standaardconfiguratie worden de appsettings.json
en appsettings.{Environment}.json
bestanden ingeschakeld met reloadOnChange: true. Wijzigingen die zijn aangebracht in het appsettings.json
bestand en het appsettings.{Environment}.json
bestand nadat de app gestart is, worden gelezen door JSON-configuratieprovider.
Zie de JSON-configuratieprovider in dit document voor informatie over het toevoegen van extra JSON-configuratiebestanden.
Serviceverzameling combineren
Houd rekening met het volgende waarmee services worden geregistreerd en opties worden geconfigureerd:
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();
Gerelateerde groepen registraties kunnen worden verplaatst naar een extensiemethode om services te registreren. De configuratieservices worden bijvoorbeeld toegevoegd aan de volgende klasse:
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;
}
}
}
De resterende services worden geregistreerd in een vergelijkbare klasse. De volgende code maakt gebruik van de nieuwe extensiemethoden om de services te registreren:
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddConfig(builder.Configuration)
.AddMyDependencyGroup();
builder.Services.AddRazorPages();
var app = builder.Build();
Opmerking: Elke services.Add{GROUP_NAME}
extensiemethode voegt services toe en configureert deze mogelijk.
AddControllersWithViews voegt bijvoorbeeld de services toe die vereist zijn door MVC-controllers met weergaven, en AddRazorPages voegt de services toe die vereist zijn door Razor Pagina's.
Beveiligings- en gebruikersgeheimen
Richtlijnen voor configuratiegegevens:
- Sla nooit wachtwoorden of andere gevoelige gegevens op in configuratieprovidercode of in configuratiebestanden met tekst zonder opmaak. Het hulpprogramma Secret Manager kan worden gebruikt om geheimen voor ontwikkelingsdoeleinden op te slaan.
- Gebruik geen productiegeheimen in ontwikkel- of testomgevingen.
- Geef geheimen buiten het project op, zodat ze niet per ongeluk kunnen worden doorgevoerd in een opslagplaats met broncode.
- Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromen voor meer informatie.
Standaard wordt de configuratiebron voor gebruikersgeheimen geregistreerd na de JSON-configuratiebronnen. Daarom hebben gebruikersgeheimsleutels voorrang op sleutels in appsettings.json
en appsettings.{Environment}.json
.
Voor meer informatie over het opslaan van wachtwoorden of andere gevoelige gegevens:
- Meerdere omgevingen gebruiken in ASP.NET Core
- Veilige opslag van app-geheimen in ontwikkeling in ASP.NET Core: bevat advies over het gebruik van omgevingsvariabelen voor het opslaan van gevoelige gegevens. Het hulpprogramma Secret Manager gebruikt de bestandsconfiguratieprovider om gebruikersgeheimen op te slaan in een JSON-bestand op het lokale systeem.
Azure Key Vault slaat app-geheimen veilig op voor ASP.NET Core-apps. Zie de Azure Key Vault-configuratieprovider in ASP.NET Core voor meer informatie.
Omgevingsvariabelen zonder voorvoegsel
Omgevingsvariabelen zonder voorvoegsel zijn andere omgevingsvariabelen dan omgevingsvariabelen die zijn voorafgegaan door ASPNETCORE_
of DOTNET_
. Bijvoorbeeld, de sjablonen voor ASP.NET Core-webtoepassingen stellen "ASPNETCORE_ENVIRONMENT": "Development"
in launchSettings.json
in. Zie voor meer informatie over ASPNETCORE_
en DOTNET_
omgevingsvariabelen:
-
Lijst met standaardconfiguratiebronnen van hoogste tot laagste prioriteit waaronder niet-geprefixeerde,
ASPNETCORE_
-geprefixeerde enDOTNETCORE_
-geprefixeerde omgevingsvariabelen. -
DOTNET_
omgevingsvariabelen die buiten Microsoft.Extensions.Hosting worden gebruikt.
Met behulp van de standaardconfiguratie laadt de EnvironmentVariablesConfigurationProvider configuratie van sleutel-waardeparen van de omgevingsvariabele na het lezenappsettings.json
appsettings.{Environment}.json
, en gebruikersgeheimen. Sleutelwaarden die uit de omgeving worden gelezen, overschrijven daarom waarden uit appsettings.json
, appsettings.{Environment}.json
en gebruikersgeheimen.
Het :
-scheidingsteken werkt niet met hiërarchische sleutels van omgevingsvariabelen op alle platformen. Het :
-scheidingsteken wordt bijvoorbeeld niet ondersteund door Bash. Het dubbele onderstrepingsteken, __
, is:
- Ondersteund door alle platforms.
- Automatisch vervangen door dubbelpunt,
:
.
De volgende set
opdrachten:
- Stel de omgevingssleutels en -waarden in van het voorgaande voorbeeld in Windows.
- Test de instellingen bij het gebruik van het voorbeelddownload. De
dotnet run
opdracht moet worden uitgevoerd in de projectmap.
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run
De voorgaande omgevingsinstellingen:
- Worden alleen ingesteld in processen die zijn gestart vanuit het opdrachtvenster waarin ze zijn ingesteld.
- Wordt niet gelezen door browsers die zijn gestart met Visual Studio.
De volgende setx-opdrachten kunnen worden gebruikt om de omgevingssleutels en -waarden in Windows in te stellen. In tegenstelling tot set
, setx
instellingen blijven behouden.
/M
stelt de variabele in de systeemomgeving in. Als de /M
switch niet wordt gebruikt, wordt een gebruikersomgevingsvariabele ingesteld.
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
Testen of de voorgaande opdrachten appsettings.json
en appsettings.{Environment}.json
overschrijven:
- Met Visual Studio: Visual Studio afsluiten en opnieuw starten.
- Met de CLI: Start een nieuw opdrachtvenster en voer dit in
dotnet run
.
Roep AddEnvironmentVariables een tekenreeks aan om een voorvoegsel voor omgevingsvariabelen op te geven:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
var app = builder.Build();
In de voorgaande code:
-
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_")
wordt toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider. - Omgevingsvariabelen die zijn ingesteld met het
MyCustomPrefix_
voorvoegsel overschrijven de standaardconfiguratieproviders. Dit omvat omgevingsvariabelen zonder het voorvoegsel.
Het voorvoegsel wordt verwijderd wanneer de configuratiesleutel-waardeparen worden gelezen.
Met de volgende opdrachten wordt het aangepaste voorvoegsel getest:
set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run
De standaardconfiguratie laadt omgevingsvariabelen en opdrachtregelargumenten voorafgegaan door DOTNET_
en ASPNETCORE_
. De DOTNET_
en ASPNETCORE_
voorvoegsels worden gebruikt door ASP.NET Core voor host- en app-configuratie, maar niet voor gebruikersconfiguratie. Zie .NET Generic Host voor meer informatie over host- en app-configuratie.
Selecteer op Azure-app Service de optie Nieuwe toepassingsinstelling Azure-app servicetoepassingsinstellingen zijn:
- Versleuteld at-rest en verzonden via een versleuteld kanaal.
- Weergegeven als omgevingsvariabelen.
Zie Azure Apps: App-configuratie overschrijven met behulp van Azure Portal voor meer informatie.
Zie verbindingsreeksvoorvoegsels voor informatie over Verbindingsreeksen in Azure Database.
Naamgeving van omgevingsvariabelen
Namen van omgevingsvariabelen weerspiegelen de structuur van een appsettings.json
bestand. Elk element in de hiërarchie wordt gescheiden door een dubbele onderstrepingsteken (bij voorkeur) of een dubbele punt. Wanneer de elementstructuur een matrix bevat, moet de matrixindex worden behandeld als een extra elementnaam in dit pad. Houd rekening met het volgende appsettings.json
bestand en de bijbehorende equivalente waarden die worden weergegeven als omgevingsvariabelen.
appsettings.json
{
"SmtpServer": "smtp.example.com",
"Logging": [
{
"Name": "ToEmail",
"Level": "Critical",
"Args": {
"FromAddress": "MySystem@example.com",
"ToAddress": "SRE@example.com"
}
},
{
"Name": "ToConsole",
"Level": "Information"
}
]
}
Omgevingsvariabelen
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
Omgevingsvariabelen die zijn ingesteld in gegenereerde launchSettings.json
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving. De ASP.NET Core-websjablonen genereren bijvoorbeeld een launchSettings.json
bestand waarmee de eindpuntconfiguratie wordt ingesteld op:
"applicationUrl": "https://localhost:5001;http://localhost:5000"
Door de applicationUrl
te configureren, wordt de ASPNETCORE_URLS
omgevingsvariabele ingesteld en worden waarden in de omgeving overschreven.
Omgevingsvariabelen ontsnappen in Linux
Op Linux moeten de waarden van URL-omgevingsvariabelen worden geëscaped zodat systemd
deze kan parsen. Gebruik de Linux-tool systemd-escape
die http:--localhost:5001
oplevert
groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001
Omgevingsvariabelen weergeven
In de volgende code worden de omgevingsvariabelen en -waarden weergegeven bij het opstarten van toepassingen. Dit kan handig zijn bij het opsporen van fouten in de omgevingsinstellingen:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}
Opdrachtregel
Met behulp van de standaardconfiguratie laadt de CommandLineConfigurationProvider de configuratie, van sleutel-waardekoppels van opdrachtregelargumenten, na de volgende configuratiebronnen:
-
appsettings.json
enappsettings.{Environment}.json
bestanden. - App-geheimen in de ontwikkelomgeving.
- Omgevingsvariabelen.
Standaard worden configuratiewaarden die zijn ingesteld op de opdrachtregel configuratiewaarden vervangen die zijn ingesteld bij alle andere configuratieproviders.
Opdrachtregelargumenten
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van =
:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van /
:
dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick
Met de volgende opdracht worden sleutels en waarden ingesteld met behulp van --
:
dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick
De sleutelwaarde:
- Moet volgen
=
of de sleutel moet een voorvoegsel hebben van--
of/
wanneer de waarde een spatie volgt. - Is niet vereist als
=
deze wordt gebruikt. Bijvoorbeeld:MySetting=
.
Combineer binnen dezelfde opdracht geen sleutel-waardeparen met opdrachtregelargumenten die worden gebruikt =
met sleutel-waardeparen die gebruikmaken van een spatie.
Switchtoewijzingen
Schakelmappingen staan vervangingslogica voor sleutelnamen toe. Geef een woordenlijst op met switchvervangingen voor de AddCommandLine methode.
Wanneer het woordenboek voor switchtoewijzingen wordt gebruikt, wordt het woordenboek gecontroleerd op een sleutel die overeenkomt met de sleutel die door een opdrachtregelargument wordt geleverd. Als de opdrachtregelsleutel wordt gevonden in de woordenlijst, wordt de waarde van de woordenlijst teruggegeven om het sleutel-waardepaar in te stellen in de configuratie van de app. Een switchtoewijzing is vereist voor elke opdrachtregelsleutel die wordt voorafgegaan door één streepje (-
).
Regels voor sleutels van schakelmappings in woordenboeken:
- Schakelopties moeten beginnen met
-
of--
. - De woordenlijst voor switchtoewijzingen mag geen dubbele sleutels bevatten.
Als u een woordenlijst voor switchtoewijzingen wilt gebruiken, geeft u deze door bij de aanroep van 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();
Voer de volgende opdracht uit om de sleutelvervanging te testen:
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
De volgende code toont de sleutelwaarden voor de vervangen sleutels:
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"]}'");
}
}
Voor apps die switchtoewijzingen gebruiken, mag de aanroep geen argumenten doorgeven. De CreateDefaultBuilder
aanroep van AddCommandLine
de methode bevat geen toegewezen switches en er is geen manier om de woordenlijst voor switchtoewijzing door te geven aan CreateDefaultBuilder
. De oplossing is niet om de argumenten door te geven aanCreateDefaultBuilder
, maar in plaats daarvan de methode van AddCommandLine
de ConfigurationBuilder
methode toe te staan zowel de argumenten als de woordenlijst voor switchtoewijzing te verwerken.
Omgevings- en opdrachtregelargumenten instellen met Visual Studio
Omgevings- en opdrachtregelargumenten kunnen in Visual Studio worden ingesteld vanuit het dialoogvenster Opstartprofielen:
- Klik in Solution Explorer met de rechtermuisknop op het project en selecteer Eigenschappen.
- Selecteer het tabblad Foutopsporings > algemeen en selecteer de gebruikersinterface voor het openen van startprofielen voor foutopsporing.
Hiërarchische configuratiegegevens
De configuratie-API leest hiërarchische configuratiegegevens door de hiërarchische gegevens plat te maken met behulp van een scheidingsteken in de configuratiesleutels.
Het voorbeelddownload bevat het volgende appsettings.json
bestand:
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
In de volgende code van het voorbeelddownload worden verschillende configuratie-instellingen weergegeven:
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}");
}
}
De voorkeursmethode voor het lezen van hiërarchische configuratiegegevens is het gebruik van het optiespatroon. Zie Hiërarchische bindingsconfiguratiegegevens in dit document voor meer informatie.
GetSection en GetChildren methoden zijn beschikbaar om secties en onderliggende elementen van een sectie in de configuratiegegevens te isoleren. Deze methoden worden verderop beschreven in GetSection, GetChildren en Exists.
Configuratiesleutels en -waarden
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
Configuratiesleutels:
- Zijn niet hoofdlettergevoelig.
ConnectionString
enconnectionstring
worden bijvoorbeeld behandeld als gelijkwaardige sleutels. - Als een sleutel en waarde is ingesteld in meer dan één configuratieprovider, wordt de waarde van de laatste toegevoegde provider gebruikt. Zie De standaardconfiguratie voor meer informatie.
- Hiërarchische sleutels
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
:
) op alle platforms. - In omgevingsvariabelen werkt een dubbele punt als scheidingsteken mogelijk niet op alle platforms. Een dubbele onderstrepingsteken,
__
, wordt ondersteund door alle platforms en wordt automatisch omgezet naar een dubbelpunt:
. - In Azure Key Vault gebruiken hiërarchische sleutels
--
als scheidingsteken. De Azure Key Vault-configuratieprovider vervangt automatisch--
door een:
wanneer de geheimen in de configuratie van de app worden geladen.
- Binnen de configuratie-API werkt een dubbele puntscheidingsteken (
- De ConfigurationBinder functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Matrixbinding wordt beschreven in de matrix binden aan een klassesectie .
Configuratiewaarden:
- Dit zijn tekenreeksen.
- Null-waarden kunnen niet worden opgeslagen in de configuratie of gebonden aan objecten.
Configuratieproviders
In de volgende tabel ziet u de configuratieproviders die beschikbaar zijn voor ASP.NET Core-apps.
Aanbieder | Zorgt voor configuratie vanuit |
---|---|
Azure Key Vault-configuratieprovider | Azure Key Vault |
Azure-app-configuratieprovider | Azure App Configuration (Configuratie van Azure-apps) |
Commandoregelconfiguratieprovider | Opdrachtregelparameters |
aangepaste configuratieprovider | Aangepaste bron |
configuratieprovider voor omgevingsvariabelen | Omgevingsvariabelen |
bestandsconfiguratieprovider | INI-, JSON- en XML-bestanden |
nl-NL: Sleutel-per-bestand-configuratieprovider | Directorybestanden |
geheugenconfiguratieprovider | Verzamelingen in het geheugen |
Gebruikersgeheimen | Het bestand in de gebruikersprofielmap |
Configuratiebronnen worden gelezen in de volgorde waarin hun configuratieproviders worden opgegeven. Rangschik configuratieproviders in de code volgens de prioriteiten voor de configuratiebronnen die de app nodig heeft.
Een typische reeks configuratieproviders is:
appsettings.json
appsettings.{Environment}.json
- Gebruikersgeheimen
- Omgevingsvariabelen met behulp van de configuratieprovider Omgevingsvariabelen .
- Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
Een veelvoorkomende procedure is om de opdrachtregelconfiguratieprovider voor het laatst toe te voegen in een reeks providers om opdrachtregelargumenten toe te staan om de configuratie die door de andere providers is ingesteld, te overschrijven.
De voorgaande reeks providers wordt gebruikt in de standaardconfiguratie.
Verbindingsreeksvoorvoegsels
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
De configuratie-API heeft speciale verwerkingsregels voor vier verbindingsreeks omgevingsvariabelen. Deze verbindingsreeks zijn betrokken bij het configureren van Azure-verbindingsreeks s voor de app-omgeving. Omgevingsvariabelen met de voorvoegsels die in de tabel worden weergegeven, worden in de app geladen met de standaardconfiguratie of wanneer er geen voorvoegsel wordt opgegeven aan AddEnvironmentVariables
.
Verbindingsreeksvoorvoegsel | Aanbieder |
---|---|
CUSTOMCONNSTR_ |
Aangepaste leverancier |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL Database |
SQLCONNSTR_ |
SQL Server |
Wanneer een omgevingsvariabele wordt gedetecteerd en in de configuratie wordt geladen met een van de vier voorvoegsels die in de tabel worden weergegeven:
- De configuratiesleutel wordt gemaakt door het voorvoegsel van de omgevingsvariabele te verwijderen en een sectie met een configuratiesleutel (
ConnectionStrings
) toe te voegen. - Er wordt een nieuw sleutel-waardepaar voor de configuratie gemaakt dat de databaseverbindingsprovider vertegenwoordigt (met uitzondering van
CUSTOMCONNSTR_
, waarvoor geen vermelde provider is opgegeven).
Sleutel voor omgevingsvariabele | Geconverteerde configuratiesleutel | Providerconfiguratie-vermelding |
---|---|---|
CUSTOMCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Configuratievermelding niet gemaakt. |
MYSQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: MySql.Data.MySqlClient |
SQLAZURECONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
SQLCONNSTR_{KEY} |
ConnectionStrings:{KEY} |
Sleutel: : ConnectionStrings:{KEY}_ProviderName Waarde: System.Data.SqlClient |
Bestandsconfiguratieprovider
FileConfigurationProvider is de basisklasse voor het laden van de configuratie van het bestandssysteem. De volgende configuratieproviders zijn afgeleid van FileConfigurationProvider
:
INI-configuratieprovider
De IniConfigurationProvider laadt tijdens runtime configuratie vanuit INI-bestandssleutel-waardeparen.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyIniConfig.ini
en MyIniConfig.{Environment}.ini
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyIniConfig.ini
bestand:
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
JSON-configuratieprovider
De JsonConfigurationProvider laadt de configuratie vanuit de sleutel-waardeparen van het JSON-bestand.
Overbelastingen kunnen het volgende opgeven:
- Of het bestand optioneel is.
- Of de configuratie opnieuw wordt geladen als het bestand wordt gewijzigd.
Houd rekening met de volgende code:
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();
De voorgaande code:
- Hiermee configureert u de JSON-configuratieprovider om het
MyConfig.json
bestand te laden met de volgende opties:-
optional: true
: Het bestand is optioneel. -
reloadOnChange: true
: het bestand wordt opnieuw geladen wanneer wijzigingen worden opgeslagen.
-
- Leest de standaardconfiguratieproviders vóór het
MyConfig.json
bestand. Instellingen in deMyConfig.json
instelling voor het overschrijven van bestanden in de standaardconfiguratieproviders, waaronder de configuratieprovider voor omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
Normaal gesproken wilt u geen aangepast JSON-bestand dat waarden overschrijft die zijn ingesteld in de configuratieprovider omgevingsvariabelen en de opdrachtregelconfiguratieprovider.
XML-configuratieprovider
De XmlConfigurationProvider configuratie wordt tijdens runtime geladen van sleutel-waardeparen van XML-bestanden.
Met de volgende code worden verschillende configuratieproviders toegevoegd:
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();
In de voorgaande code worden instellingen in de MyXMLFile.xml
en MyXMLFile.{Environment}.xml
bestanden overschreven door instellingen in de:
Het voorbeelddownload bevat het volgende MyXMLFile.xml
bestand:
<?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>
In de volgende code uit het voorbeelddownload worden verschillende van de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
Herhalende elementen die dezelfde elementnaam gebruiken, werken als het name
kenmerk wordt gebruikt om de elementen te onderscheiden:
<?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>
De volgende code leest het vorige configuratiebestand en geeft de sleutels en waarden weer:
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"
);
}
}
Kenmerken kunnen worden gebruikt om waarden op te geven:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
In het vorige configuratiebestand worden de volgende sleutels geladen met value
:
- key:attribute
- section:key:attribute
Configuratieprovider voor sleutel per bestand
De KeyPerFileConfigurationProvider map maakt gebruik van de bestanden van een map als configuratiesleutel-waardeparen. De sleutel is de bestandsnaam. De waarde bevat de inhoud van het bestand. De key-per-file-configuratieprovider wordt gebruikt in Docker-hostingscenario's.
Als u key-per-file-configuratie wilt activeren, roept u de AddKeyPerFile extensiemethode aan op een exemplaar van ConfigurationBuilder. De directoryPath
bestanden moeten een absoluut pad zijn.
Overbelastingen maken het opgeven van:
- Een
Action<KeyPerFileConfigurationSource>
gemachtigde die de bron configureert. - Of de map optioneel is en of het pad naar de map is.
Het dubbele onderstrepingsteken (__
) wordt gebruikt als scheidingsteken voor configuratiesleutels in bestandsnamen. De bestandsnaam Logging__LogLevel__System
produceert bijvoorbeeld de configuratiesleutel Logging:LogLevel:System
.
Aanroepen ConfigureAppConfiguration
bij het bouwen van de host om de configuratie van de app op te geven:
.ConfigureAppConfiguration((hostingContext, config) =>
{
var path = Path.Combine(
Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
Geheugenconfiguratieprovider
Hierbij MemoryConfigurationProvider wordt een verzameling in het geheugen gebruikt als configuratiesleutel-waardeparen.
Met de volgende code wordt een geheugenverzameling toegevoegd aan het configuratiesysteem:
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();
In de volgende code van het voorbeelddownload worden de voorgaande configuratie-instellingen weergegeven:
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}");
}
}
In de voorgaande code config.AddInMemoryCollection(Dict)
wordt deze toegevoegd na de standaardconfiguratieproviders. Zie JSON-configuratieprovider voor een voorbeeld van het ordenen van de configuratieprovider.
Zie Een matrix binden voor een ander voorbeeld met behulp van MemoryConfigurationProvider
.
Kestrel eindpuntconfiguratie
Kestrel specifieke eindpuntconfiguratie overschrijft alle serveroverschrijdende eindpuntconfiguraties. Configuraties voor eindpunten tussen servers zijn onder andere:
- UseUrls
-
--urls
op de commandoregel - De omgevingsvariabele
ASPNETCORE_URLS
Houd rekening met het volgende appsettings.json
bestand dat wordt gebruikt in een ASP.NET Core-web-app:
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Wanneer de voorgaande gemarkeerde markering wordt gebruikt in een ASP.NET Core-web-app en de app wordt gestart op de opdrachtregel met de volgende server-overschrijdende eindpuntconfiguratie:
dotnet run --urls="https://localhost:7777"
Kestrel verbindt met het eindpunt dat specifiek is geconfigureerd voor Kestrel in het appsettings.json
bestand (https://localhost:9999
) en niet https://localhost:7777
.
Overweeg het Kestrel specifieke eindpunt dat is geconfigureerd als een omgevingsvariabele:
set Kestrel__Endpoints__Https__Url=https://localhost:8888
In de voorgaande omgevingsvariabele Https
is dit de naam van het Kestrel specifieke eindpunt. Het voorgaande appsettings.json
bestand definieert ook een specifiek eindpunt met de Kestrel naam Https
. Standaard wordt de omgevingsvariabele die gebruikmaakt van de configuratieprovider Omgevingsvariabelen gelezen nadat appsettings.{Environment}.json
, daarom wordt de voorgaande omgevingsvariabele gebruikt voor het Https
eindpunt.
WaardeOphalen
ConfigurationBinder.GetValue extraheert één waarde uit de configuratie met een opgegeven sleutel en converteert deze naar het opgegeven type:
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}");
}
}
In de voorgaande code, als NumberKey
niet in de configuratie wordt gevonden, wordt de standaardwaarde 99
gebruikt.
GetSection, GetChildren en Exists
Bekijk het volgende MySubsection.json
bestand voor de volgende voorbeelden:
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
De volgende code voegt MySubsection.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MySubsection.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
GetSection
IConfiguration.GetSection retourneert een configuratiesubsectie met de opgegeven subsectiesleutel.
De volgende code retourneert waarden voor 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"]}'");
}
}
De volgende code retourneert waarden voor 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
keert null
nooit terug. Als er geen overeenkomende sectie wordt gevonden, wordt een lege IConfigurationSection
sectie geretourneerd.
Wanneer GetSection
een overeenkomende sectie retourneert, wordt Value niet ingevuld.
Key en Path worden geretourneerd wanneer de sectie bestaat.
GetChildren and Exists
De volgende code roept IConfiguration.GetChildren waarden aan en retourneert waarden voor 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);
}
}
De voorgaande code aanroepen ConfigurationExtensions.Exists om te controleren of de sectie bestaat:
Een matrix binden
De ConfigurationBinder.Bind functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Elke matrixindeling die een numeriek sleutelsegment beschikbaar maakt, kan matrixbindingen uitvoeren op een POCO-klassematrix .
Houd rekening met MyArray.json
uit de voorbeeld-download:
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
De volgende code voegt MyArray.json
toe aan de configuratieproviders:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.AddJsonFile("MyArray.json",
optional: true,
reloadOnChange: true);
builder.Services.AddRazorPages();
var app = builder.Build();
Met de volgende code wordt de configuratie gelezen en worden de waarden weergegeven:
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; }
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
In de voorgaande uitvoer heeft Index 3 een waarde value40
die overeenkomt met "4": "value40",
in MyArray.json
. De afhankelijke matrixindexen zijn doorlopend en zijn niet gebonden aan de configuratiesleutelindex. De configuratiebinding kan geen null-waarden binden of null-vermeldingen maken in afhankelijke objecten.
Aangepaste configuratieprovider
De voorbeeld-app laat zien hoe u een eenvoudige configuratieprovider maakt die configuratiesleutel-waardeparen van een database leest met behulp van Entity Framework (EF).
De provider heeft de volgende kenmerken:
- De EF-database in het geheugen wordt gebruikt voor demonstratiedoeleinden. Als u een database wilt gebruiken waarvoor een verbindingsreeks is vereist, implementeert u een secundaire
ConfigurationBuilder
om de verbindingsreeks van een andere configuratieprovider op te geven. - De provider leest een databasetabel in de configuratie bij het opstarten. De provider doorzoekt de database niet per sleutel.
- Reload-on-change is niet geïmplementeerd, dus het bijwerken van de database nadat de app is gestart, heeft geen invloed op de configuratie van de app.
Definieer een EFConfigurationValue
entiteit voor het opslaan van configuratiewaarden in de database.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
}
Voeg een EFConfigurationContext
toe om de geconfigureerde waarden op te slaan en te openen.
EFConfigurationProvider/EFConfigurationContext.cs
:
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}
Maak een klasse die IConfigurationSource implementeert.
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);
}
Maak de aangepaste configuratieprovider door deze over te nemen van ConfigurationProvider. De configuratieprovider initialiseert de database wanneer deze leeg is. Omdat configuratiesleutels niet hoofdlettergevoelig zijn, wordt de woordenlijst die wordt gebruikt om de database te initialiseren gemaakt met de niet-hoofdlettergevoelige vergelijking (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;
}
}
Met een AddEFConfiguration
extensiemethode kan de configuratiebron worden toegevoegd aan een ConfigurationBuilder
.
Extensions/EntityFrameworkExtensions.cs
:
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
De volgende code laat zien hoe u de aangepaste EFConfigurationProvider
code gebruikt in Program.cs
:
//using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEFConfiguration(
opt => opt.UseInMemoryDatabase("InMemoryDb"));
var app = builder.Build();
app.Run();
Toegangsconfiguratie met afhankelijkheidsinjectie (DI)
Configuratie kan worden geïnjecteerd in services met behulp van afhankelijkheidsinjectie (DI) door de service IConfiguration op te lossen.
public class Service
{
private readonly IConfiguration _config;
public Service(IConfiguration config) =>
_config = config;
public void DoSomething()
{
var configSettingValue = _config["ConfigSetting"];
// ...
}
}
Zie voor informatie over hoe u waarden kunt benaderen met behulp van IConfiguration
, GetValue en GetSection, GetChildren en Exists in dit artikel.
Configuratie voor toegang in Razor Pagina's
De volgende code geeft configuratiegegevens weer op een Razor pagina:
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
In de volgende code MyOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
using SampleApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MyOptions>(
builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
In de volgende markeringen wordt de @inject
Razor instructie gebruikt om de waarde van de opties op te lossen en weer te geven:
@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>
Toegangsconfiguratie in een MVC-weergavebestand
De volgende code geeft configuratiegegevens weer in een MVC-weergave:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Toegangsconfiguratie in Program.cs
De volgende code heeft toegang tot de configuratie in het Program.cs
bestand.
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();
In appsettings.json
het voorgaande voorbeeld:
{
...
"KeyOne": "Key One Value",
"KeyTwo": 1999,
"KeyThree": true
}
Opties configureren met een gemachtigde
Opties die zijn geconfigureerd in een delegaat, overschrijven waarden die zijn ingesteld in de configuratieproviders.
In de volgende code wordt een IConfigureOptions<TOptions> service toegevoegd aan de servicecontainer. Er wordt een gemachtigde gebruikt om waarden te configureren voor 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();
In de volgende code worden de optieswaarden weergegeven:
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}");
}
}
In het voorgaande voorbeeld worden de waarden van Option1
en Option2
opgegeven in appsettings.json
en vervolgens overschreven door de geconfigureerde gemachtigde.
Host versus app-configuratie
Voordat de app is geconfigureerd en gestart, wordt een host geconfigureerd en gestart. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. Zowel de app als de host worden geconfigureerd met behulp van de configuratieproviders die in dit onderwerp worden beschreven. Hostconfiguratiesleutel-waardeparen worden ook opgenomen in de configuratie van de app. Zie voor meer informatie over hoe de configuratieproviders worden gebruikt wanneer de host wordt gebouwd en hoe configuratiebronnen van invloed zijn op de hostconfiguratie ASP.NET overzicht van basisbeginselen.
Standaardhostconfiguratie
Zie de ASP.NET Core 2.2-versie van dit onderwerp voor meer informatie over de standaardconfiguratie wanneer u de webhost gebruikt.
- Hostconfiguratie wordt geleverd van:
- Omgevingsvariabelen voorafgegaan door
DOTNET_
(bijvoorbeeldDOTNET_ENVIRONMENT
) met behulp van de configuratieprovider Omgevingsvariabelen. Het voorvoegsel (DOTNET_
) wordt verwijderd wanneer de configuratiesleutel-waardeparen worden geladen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen voorafgegaan door
- De standaardconfiguratie van de webhost is ingesteld (
ConfigureWebHostDefaults
):- Kestrel wordt gebruikt als de webserver en geconfigureerd met behulp van de configuratieproviders van de app.
- Voeg middleware voor het filteren van hosts toe.
- Voeg Forwarded Headers-middleware toe als de
ASPNETCORE_FORWARDEDHEADERS_ENABLED
omgevingsvariabele is gesteld optrue
. - IIS-integratie inschakelen.
Andere configuratie
Dit onderwerp heeft alleen betrekking op app-configuratie. Andere aspecten van het uitvoeren en hosten van ASP.NET Core-apps worden geconfigureerd met behulp van configuratiebestanden die niet in dit onderwerp worden behandeld:
-
launch.json
/launchSettings.json
zijn configuratiebestanden voor tooling in de ontwikkelomgeving, beschreven:- In Gebruik meerdere omgevingen in ASP.NET Core.
- In de documentatieset waarin de bestanden worden gebruikt voor het configureren van ASP.NET Core-apps voor ontwikkelingsscenario's.
-
web.config
is een serverconfiguratiebestand dat wordt beschreven in de volgende onderwerpen:
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving.
Zie Configuratie migreren naar ASP.NET Core voor meer informatie over het migreren van app-configuratie van eerdere versies van ASP.NET.
Configuratie toevoegen vanuit een externe assembly
Met een IHostingStartup-implementatie kunt u verbeteringen aan een app toevoegen bij het opstarten vanuit een externe assembly buiten de Startup
klasse van de app. Zie Hosting-opstartassembly's gebruiken in ASP.NET Corevoor meer informatie.
Aanvullende bronnen
Kestrel eindpuntconfiguratie
Kestrel specifieke eindpuntconfiguratie overschrijft alle serveroverschrijdende eindpuntconfiguraties. Configuraties voor eindpunten tussen servers zijn onder andere:
- UseUrls
-
--urls
op de commandoregel - De omgevingsvariabele
ASPNETCORE_URLS
Houd rekening met het volgende appsettings.json
bestand dat wordt gebruikt in een ASP.NET Core-web-app:
{
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:9999"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Wanneer de voorgaande gemarkeerde markering wordt gebruikt in een ASP.NET Core-web-app en de app wordt gestart op de opdrachtregel met de volgende server-overschrijdende eindpuntconfiguratie:
dotnet run --urls="https://localhost:7777"
Kestrel verbindt met het eindpunt dat specifiek is geconfigureerd voor Kestrel in het appsettings.json
bestand (https://localhost:9999
) en niet https://localhost:7777
.
Overweeg het Kestrel specifieke eindpunt dat is geconfigureerd als een omgevingsvariabele:
set Kestrel__Endpoints__Https__Url=https://localhost:8888
In de voorgaande omgevingsvariabele Https
is dit de naam van het Kestrel specifieke eindpunt. Het voorgaande appsettings.json
bestand definieert ook een specifiek eindpunt met de Kestrel naam Https
. Standaard wordt de omgevingsvariabele die gebruikmaakt van de configuratieprovider Omgevingsvariabelen gelezen nadat appsettings.{Environment}.json
, daarom wordt de voorgaande omgevingsvariabele gebruikt voor het Https
eindpunt.
WaardeOphalen
ConfigurationBinder.GetValue extraheert één waarde uit de configuratie met een opgegeven sleutel en converteert deze naar het opgegeven type. Deze methode is een extensiemethode voor 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}");
}
}
In de voorgaande code, als NumberKey
niet in de configuratie wordt gevonden, wordt de standaardwaarde 99
gebruikt.
GetSection, GetChildren en Exists
Bekijk het volgende MySubsection.json
bestand voor de volgende voorbeelden:
{
"section0": {
"key0": "value00",
"key1": "value01"
},
"section1": {
"key0": "value10",
"key1": "value11"
},
"section2": {
"subsection0": {
"key0": "value200",
"key1": "value201"
},
"subsection1": {
"key0": "value210",
"key1": "value211"
}
}
}
De volgende code voegt MySubsection.json
toe aan de configuratieproviders:
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>();
});
}
GetSection
IConfiguration.GetSection retourneert een configuratiesubsectie met de opgegeven subsectiesleutel.
De volgende code retourneert waarden voor 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"]}'");
}
}
De volgende code retourneert waarden voor 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
keert null
nooit terug. Als er geen overeenkomende sectie wordt gevonden, wordt een lege IConfigurationSection
sectie geretourneerd.
Wanneer GetSection
een overeenkomende sectie retourneert, wordt Value niet ingevuld.
Key en Path worden geretourneerd wanneer de sectie bestaat.
GetChildren and Exists
De volgende code roept IConfiguration.GetChildren waarden aan en retourneert waarden voor 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);
}
}
De voorgaande code aanroepen ConfigurationExtensions.Exists om te controleren of de sectie bestaat:
Een matrix binden
De ConfigurationBinder.Bind functie ondersteunt bindingsmatrices voor objecten met behulp van matrixindexen in configuratiesleutels. Elke matrixindeling die een numeriek sleutelsegment beschikbaar maakt, kan matrixbindingen uitvoeren op een POCO-klassematrix .
Houd rekening met MyArray.json
uit de voorbeeld-download:
{
"array": {
"entries": {
"0": "value00",
"1": "value10",
"2": "value20",
"4": "value40",
"5": "value50"
}
}
}
De volgende code voegt MyArray.json
toe aan de configuratieproviders:
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>();
});
}
Met de volgende code wordt de configuratie gelezen en worden de waarden weergegeven:
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);
}
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value00
Index: 1 Value: value10
Index: 2 Value: value20
Index: 3 Value: value40
Index: 4 Value: value50
In de voorgaande uitvoer heeft Index 3 een waarde value40
die overeenkomt met "4": "value40",
in MyArray.json
. De afhankelijke matrixindexen zijn doorlopend en zijn niet gebonden aan de configuratiesleutelindex. De configuratiebinding kan geen null-waarden binden of null-vermeldingen maken in afhankelijke objecten
Met de volgende code wordt de array:entries
configuratie geladen met de AddInMemoryCollection extensiemethode:
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>();
});
}
}
De volgende code leest de configuratie in de arrayDict
Dictionary
en geeft de waarden weer:
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);
}
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value0
Index: 1 Value: value1
Index: 2 Value: value2
Index: 3 Value: value4
Index: 4 Value: value5
Index #3 in het gebonden object bevat de configuratiegegevens voor de configuratiesleutel array:4
en de waarde ervan van value4
. Wanneer configuratiegegevens met een matrix zijn gebonden, worden de matrixindexen in de configuratiesleutels gebruikt om de configuratiegegevens te herhalen bij het maken van het object. Een null-waarde kan niet worden bewaard in configuratiegegevens en een vermelding met null-waarden wordt niet gemaakt in een afhankelijk object wanneer een matrix in configuratiesleutels een of meer indexen overslaat.
Het ontbrekende configuratie-item voor index 3 kan worden opgegeven voordat de binding met het ArrayExample
exemplaar wordt uitgevoerd door een configuratieprovider die het sleutel-/waardepaar van de index #3 leest. Bekijk het volgende Value3.json
bestand uit de voorbeelddownload:
{
"array:entries:3": "value3"
}
De volgende code bevat configuratie voor Value3.json
en de 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>();
});
}
}
De volgende code leest de voorgaande configuratie en geeft de waarden weer:
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);
}
}
De voorgaande code retourneert de volgende uitvoer:
Index: 0 Value: value0
Index: 1 Value: value1
Index: 2 Value: value2
Index: 3 Value: value3
Index: 4 Value: value4
Index: 5 Value: value5
Aangepaste configuratieproviders zijn niet vereist om matrixbinding te implementeren.
Aangepaste configuratieprovider
Waarschuwing
In dit artikel wordt het gebruik van verbindingsreeksen beschreven. Met een lokale database hoeft de gebruiker niet te worden geverifieerd, maar in productie bevatten verbindingsreeksen soms een wachtwoord om te verifiëren. Een wachtwoordgegevens voor een eigenaar van een bron (ROPC) is een beveiligingsrisico dat moet worden vermeden in productiedatabases. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor apps die zijn geïmplementeerd voor test- of productieomgevingen.
De voorbeeld-app laat zien hoe u een eenvoudige configuratieprovider maakt die configuratiesleutel-waardeparen van een database leest met behulp van Entity Framework (EF).
De provider heeft de volgende kenmerken:
- De EF-database in het geheugen wordt gebruikt voor demonstratiedoeleinden. Als u een database wilt gebruiken waarvoor een verbindingsreeks is vereist, implementeert u een secundaire
ConfigurationBuilder
om de verbindingsreeks van een andere configuratieprovider op te geven. - De provider leest een databasetabel in de configuratie bij het opstarten. De provider doorzoekt de database niet per sleutel.
- Reload-on-change is niet geïmplementeerd, dus het bijwerken van de database nadat de app is gestart, heeft geen invloed op de configuratie van de app.
Definieer een EFConfigurationValue
entiteit voor het opslaan van configuratiewaarden in de database.
Models/EFConfigurationValue.cs
:
public class EFConfigurationValue
{
public string Id { get; set; }
public string Value { get; set; }
}
Voeg een EFConfigurationContext
toe om de geconfigureerde waarden op te slaan en te openen.
EFConfigurationProvider/EFConfigurationContext.cs
:
// using Microsoft.EntityFrameworkCore;
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values { get; set; }
}
Maak een klasse die IConfigurationSource implementeert.
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);
}
}
Maak de aangepaste configuratieprovider door deze over te nemen van ConfigurationProvider. De configuratieprovider initialiseert de database wanneer deze leeg is. Omdat configuratiesleutels niet hoofdlettergevoelig zijn, wordt de woordenlijst die wordt gebruikt om de database te initialiseren gemaakt met de niet-hoofdlettergevoelige vergelijking (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;
}
}
Met een AddEFConfiguration
extensiemethode kan de configuratiebron worden toegevoegd aan een 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));
}
}
De volgende code laat zien hoe u de aangepaste EFConfigurationProvider
code gebruikt in Program.cs
:
// using Microsoft.EntityFrameworkCore;
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddEFConfiguration(
options => options.UseInMemoryDatabase("InMemoryDb"));
})
Toegangsconfiguratie bij opstarten
De volgende code geeft configuratiegegevens weer in Startup
methoden:
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();
});
}
}
Zie App startup: Convenience methods voor een voorbeeld van toegang tot de configuratie met behulp van startgemakmethoden.
Configuratie voor toegang in Razor Pagina's
De volgende code geeft configuratiegegevens weer op een Razor pagina:
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
In de volgende code MyOptions
wordt deze toegevoegd aan de servicecontainer met Configure en gebonden aan de configuratie:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
services.AddRazorPages();
}
In de volgende markeringen wordt de @inject
Razor instructie gebruikt om de waarde van de opties op te lossen en weer te geven:
@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>
Toegangsconfiguratie in een MVC-weergavebestand
De volgende code geeft configuratiegegevens weer in een MVC-weergave:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
Configuration value for 'MyKey': @Configuration["MyKey"]
Opties configureren met een gemachtigde
Opties die zijn geconfigureerd in een delegaat, overschrijven waarden die zijn ingesteld in de configuratieproviders.
Het configureren van opties met een gemachtigde wordt gedemonstreerd als voorbeeld 2 in de voorbeeld-app.
In de volgende code wordt een IConfigureOptions<TOptions> service toegevoegd aan de servicecontainer. Er wordt een gemachtigde gebruikt om waarden te configureren voor MyOptions
:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
});
services.AddRazorPages();
}
In de volgende code worden de optieswaarden weergegeven:
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}");
}
}
In het voorgaande voorbeeld worden de waarden van Option1
en Option2
opgegeven in appsettings.json
en vervolgens overschreven door de geconfigureerde gemachtigde.
Host versus app-configuratie
Voordat de app is geconfigureerd en gestart, wordt een host geconfigureerd en gestart. De host is verantwoordelijk voor het opstarten en levensduurbeheer van apps. Zowel de app als de host worden geconfigureerd met behulp van de configuratieproviders die in dit onderwerp worden beschreven. Hostconfiguratiesleutel-waardeparen worden ook opgenomen in de configuratie van de app. Zie voor meer informatie over hoe de configuratieproviders worden gebruikt wanneer de host wordt gebouwd en hoe configuratiebronnen van invloed zijn op de hostconfiguratie ASP.NET overzicht van basisbeginselen.
Standaardhostconfiguratie
Zie de ASP.NET Core 2.2-versie van dit onderwerp voor meer informatie over de standaardconfiguratie wanneer u de webhost gebruikt.
- Hostconfiguratie wordt geleverd van:
- Omgevingsvariabelen voorafgegaan door
DOTNET_
(bijvoorbeeldDOTNET_ENVIRONMENT
) met behulp van de configuratieprovider Omgevingsvariabelen. Het voorvoegsel (DOTNET_
) wordt verwijderd wanneer de configuratiesleutel-waardeparen worden geladen. - Opdrachtregelargumenten met behulp van de opdrachtregelconfiguratieprovider.
- Omgevingsvariabelen voorafgegaan door
- De standaardconfiguratie van de webhost is ingesteld (
ConfigureWebHostDefaults
):- Kestrel wordt gebruikt als de webserver en geconfigureerd met behulp van de configuratieproviders van de app.
- Voeg middleware voor het filteren van hosts toe.
- Voeg Forwarded Headers-middleware toe als de
ASPNETCORE_FORWARDEDHEADERS_ENABLED
omgevingsvariabele is gesteld optrue
. - IIS-integratie inschakelen.
Andere configuratie
Dit onderwerp heeft alleen betrekking op app-configuratie. Andere aspecten van het uitvoeren en hosten van ASP.NET Core-apps worden geconfigureerd met behulp van configuratiebestanden die niet in dit onderwerp worden behandeld:
-
launch.json
/launchSettings.json
zijn configuratiebestanden voor tooling in de ontwikkelomgeving, beschreven:- In Gebruik meerdere omgevingen in ASP.NET Core.
- In de documentatieset waarin de bestanden worden gebruikt voor het configureren van ASP.NET Core-apps voor ontwikkelingsscenario's.
-
web.config
is een serverconfiguratiebestand dat wordt beschreven in de volgende onderwerpen:
Omgevingsvariabelen die zijn ingesteld in launchSettings.json
overschrijven die in de systeemomgeving.
Zie Configuratie migreren naar ASP.NET Core voor meer informatie over het migreren van app-configuratie van eerdere versies van ASP.NET.
Configuratie toevoegen vanuit een externe assembly
Met een IHostingStartup-implementatie kunt u verbeteringen aan een app toevoegen bij het opstarten vanuit een externe assembly buiten de Startup
klasse van de app. Zie Hosting-opstartassembly's gebruiken in ASP.NET Corevoor meer informatie.