Ich habe in meinem einige Werte appsettings.json
für Dinge wie Datenbankverbindungszeichenfolgen, Webapi-Speicherorte und dergleichen definiert, die sich für Entwicklungs-, Staging- und Live-Umgebungen unterscheiden.
Gibt es eine Möglichkeit, mehrere appsettings.json
Dateien (wie appsettings.live.json
usw. usw.) zu haben und die asp.net-App nur anhand der von ihr ausgeführten Build-Konfiguration zu wissen, welche verwendet werden soll?
c#
asp.net-core
appsettings
Medikamente
quelle
quelle
Ich habe Screenshots einer Arbeitsumgebung hinzugefügt, da es mich mehrere Stunden Forschung und Entwicklung gekostet hat.
Fügen Sie Ihrer
launch.json
Datei zunächst einen Schlüssel hinzu .Siehe den folgenden Screenshot, den ich
Development
als meine Umgebung hinzugefügt habe.Erstellen Sie dann in Ihrem Projekt eine neue
appsettings.{environment}.json
Datei, die den Namen der Umgebung enthält.Suchen Sie im folgenden Screenshot nach zwei verschiedenen Dateien mit den Namen:
appsettings.Development.Json
appSetting.json
Und schließlich konfigurieren Sie es für Ihre
StartUp
Klasse wie folgt:public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
Und endlich können Sie es über die Befehlszeile wie folgt ausführen:
dotnet run --environment "Development"
Wo
"Development"
ist der Name meiner Umgebung?quelle
IWebHostEnvironment
stattdessen verwenden.Update für .NET Core 3.0+
Sie können Folgendes verwenden
CreateDefaultBuilder
, um automatisch ein Konfigurationsobjekt zu erstellen und an Ihre Startklasse zu übergeben:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
Enthält automatisch die entsprechende Datei. Fügen Sie daher für jede Umgebung eine separate App-Einstellungsdatei hinzu:appsettings.Environment.json
Legen Sie dann die
ASPNETCORE_ENVIRONMENT
Umgebungsvariable beim Ausführen / Debuggen festSo legen Sie Umgebungsvariablen fest
Abhängig von Ihrer IDE gibt es einige Stellen, an denen Dotnet-Projekte traditionell nach Umgebungsvariablen suchen:
Gehen Sie für Visual Studio zu Projekt> Eigenschaften> Debug> Umgebungsvariablen:
Bearbeiten Sie für Visual Studio-Code
.vscode/launch.json
>env
:Mit Starteinstellungen , Bearbeiten
Properties/launchSettings.json
>environmentVariables
:Welche kann auch aus der Symbolleiste in Visual Studio ausgewählt werden
Verwenden Sie bei Verwendung der Dotnet-CLI die entsprechende Syntax für Festlegen von Umgebungsvariablen Ihr Betriebssystem
Wie funktioniert das
Host.CreateDefaultBuilder
?.NET Core 3.0 wurde
Host.CreateDefaultBuilder
unter Plattformerweiterungen hinzugefügt , die eine Standardinitialisierung bereitstellen,IConfiguration
die die Standardkonfiguration für die App in der folgenden Reihenfolge bereitstellt:Weiterführende Literatur - MS Docs
quelle
In ASP.NET Core sollten Sie lieber Umgebungsvariablen verwenden, anstatt die Konfiguration für die richtige appsettings.json zu erstellen
Klicken Sie mit der rechten Maustaste auf Ihr Projekt> Eigenschaften> Debug> Umgebungsvariablen
ASP.NET Core verwendet die entsprechende Datei appsettings.json:
Jetzt können Sie diese Umgebungsvariable folgendermaßen verwenden:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
quelle
Sie können Umgebungsvariablen und die
ConfigurationBuilder
Klasse in IhremStartup
Konstruktor folgendermaßen verwenden:public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); this.configuration = builder.Build(); }
Anschließend erstellen Sie eine
appsettings.xxx.json
Datei für jede benötigte Umgebung, wobei "xxx" der Umgebungsname ist. Beachten Sie, dass Sie alle globalen Konfigurationswerte in Ihre "normale"appsettings.json
Datei einfügen und nur die umgebungsspezifischen Elemente in diese neuen Dateien einfügen können.Jetzt benötigen Sie nur noch eine Umgebungsvariable
ASPNETCORE_ENVIRONMENT
mit einem bestimmten Umgebungswert ("live", "staging", "Production" usw.). Sie können diese Variable in Ihren Projekteinstellungen für Ihre Entwicklungsumgebung angeben, und natürlich müssen Sie sie auch in Ihren Staging- und Produktionsumgebungen festlegen. Wie Sie es dort machen, hängt davon ab, um welche Umgebung es sich handelt.UPDATE: Ich habe gerade festgestellt, dass Sie die
appsettings.xxx.json
basierend auf Ihrer aktuellen Build-Konfiguration auswählen möchten . Dies kann mit meiner vorgeschlagenen Lösung nicht erreicht werden, und ich weiß nicht, ob es einen Weg gibt, dies zu tun. Die Methode "Umgebungsvariable" funktioniert jedoch und könnte genauso gut eine gute Alternative zu Ihrem Ansatz sein.quelle
Nur ein Update für Benutzer von .NET Core 2.0. Sie können die Anwendungskonfiguration nach dem Aufruf von
CreateDefaultBuilder
:public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration(ConfigConfiguration) .UseStartup<Startup>() .Build(); static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config) { config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("config.json", optional: false, reloadOnChange: true) .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); } }
quelle
ASPNETCORE_ENVIRONMENT
. Der Wert ist das, wofür ersetzt wirdctx.HostingEnvironment.EnvironmentName}
. Wenn Sie diesen Wert in den Eigenschaften auf "Produktion" setzen, sucht das Projektconfig.Production.json
im Stammordner nach einer Datei. Für weitere Informationen sehen Sie bitte diesen LinkError CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
in WebHost.CreateDefaultBuiler (...Erstellen Sie mehrere Dateien wie:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Erstellen Sie ein Pre-Build-Ereignis für das Projekt, das die entsprechende Datei kopiert in
appSettings.json
:Nur
appSettings.json
in Ihrem Config Builder verwenden:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
quelle
Sie können die Konfigurationsnamen als das hinzufügen
ASPNETCORE_ENVIRONMENT
der ,launchSettings.json
wie unten"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
quelle
Dies ist die Version, die für mich funktioniert, wenn ich eine Konsolen-App ohne Webseite verwende:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true); IConfigurationRoot configuration = builder.Build(); AppSettings appSettings = new AppSettings(); configuration.GetSection("AppSettings").Bind(appSettings);
quelle
Die Datei .vscode / launch.json wird nur von Visual Studio sowie von der Datei /Properties/launchSettings.json verwendet. Verwenden Sie diese Dateien nicht in der Produktion.
Die Datei launchSettings.json:
enthält Profileinstellungen.
So verwenden Sie beispielsweise eine Datei 'appSettings.QA.json'. Sie können 'ASPNETCORE_ENVIRONMENT' verwenden. Folgen Sie den unteren Schritten.
quelle