Laden...

Stimmt es, dass Umgebungsvariablen im ASP.NET Core sich nur auf die Anwendung selbst beziehen?

Erstellt von CoderboyPB vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.069 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren
Stimmt es, dass Umgebungsvariablen im ASP.NET Core sich nur auf die Anwendung selbst beziehen?

Hallo, brauche mal kurz die fachliche Absicherung:

Umgebungsvariablen wie ASPNETCORE_ENVIRONMENT beziehen sich nur auf die Anwendung und werden in der Config definiert, und haben nichts mit den Umgebungsvariablen meines Betriebssystems zu tun.

Ist das richtig?

16.835 Beiträge seit 2008
vor 4 Jahren

Keine Lust gehabt einfach mal nen kurzen Blick in die Doku zu werfen?
Use multiple environments in ASP.NET Core

Hier siehst Du, dass es sich sehr wohl um die Umgebungsvariablen des Betriebssystem handelt.

Je nach verwendetem Webserver werden diese Informationen auch weiter gereicht oder selbst injiziert (zB. IIS).

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo CoderboyPB,

es sind "normale" Umgebungsvariablen. Die Gültigkeit ist entweder auf Betriebssystemebene, od. die aktuelle Shell / Programm und deren Sub-Shells / aufgerufenen Programme.

ASP.NET Core hat hier keine Sonderstellung in Bezug auf die Umgebungsvariablen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Ich danke euch, für eure Antworten.

Selbstverständlich schaue ich grundsätzlich immer zuerst in die Dokumentation, aber manchmal ist man einfach 'Betriebsblind', d.h. man sieht den Wald vor lauter Bäumen nicht mehr ... 😦

Sorry, falls die Frage zu dumm war, aber ich bemühe diese Quelle hier wirklich immer erst als allerletztes, um halt eben auch 'dumme' Fragen so weit wie eben möglich zu reduzieren.

16.835 Beiträge seit 2008
vor 4 Jahren

ASP.NET Core hat hier keine Sonderstellung in Bezug auf die Umgebungsvariablen.

Nur ums genauer auszudrücken:

ASP.NET Core hat von Haus aus mal "eigene Umgebungsvariablen".
Erst durch den Zusatz von .AddEnvironmentVariables() für den ConfigurationBuilder wird nicht nur auf die Config, sondern auf die Umgebungsvariablen des Hosts zugegriffen.

Das ist insbesondere Notwendig, wenn man mit Containern wie Docker arbeitet.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Sodele, nachdem ich das mit den Umgebungsvariablen ja verstanden habe, stehe ich mal wieder auffem Schlauch, und zwar geht es um Folgendes:


public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((host, config) => config.AddEnvironmentVariables())
                .UseStartup<Startup>();

Der Doku habe ich die Zeile mit ConfigureAppConfiguration entnommen.

Den Wert der Umgebungsvariablen "variable1" möchte ich nun in einer Razor Page mittels Dependency Injection einbinden und ausgeben:


@inject  IConfiguration config

<div class="jumbotron">
    <h1>Contoso University - @config["variable1"]</h1>
</div>

So, das ganze wird fehlerfrei kompiliert und auch die Injection funktioniert, wenn ich die Variable in der 'appsettings.json' setze.

Aus der Umgebungsvariablen aber liest der nichts aus. Ich habe beide Umgebungsvariablen ausprobiert, sowohl die User Settings, als auch die System Settings.

Irgendeiner eine Idee, was da fehlt?

16.835 Beiträge seit 2008
vor 4 Jahren

Das kann in der Form auch nicht funktionieren, weil der Mechanismus so nicht funktioniert.

IConfiguration ist ein Parameter für die Startup-Klasse.
Dort kannst Du auf die IConfiguration zugreifen und Werte auf Klassen mappen via Options Pattern.

services.Configure<MySetting>(Configuration.GetSection("MySettingSection"));

Anschließend kannst Du via IOption<MySetting> auf die Option zugreifen.
Alles dokumentiert unter Options pattern in ASP.NET Core
(Übrigens ist das direkt das Kapitel nach "Konfiguration", in der die Environment Variables erklärt werden).

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Danke. Ach deshalb fehlt es hier:


public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile(
                    "json_array.json", optional: false, reloadOnChange: false);
                config.AddJsonFile(
                    "starship.json", optional: false, reloadOnChange: false);
                config.AddXmlFile(
                    "tvshow.xml", optional: false, reloadOnChange: false);
                config.AddEFConfiguration(
                    options => options.UseInMemoryDatabase("InMemoryDb"));
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();

16.835 Beiträge seit 2008
vor 4 Jahren

Das zeigt nur die potentiellen Quellen. appsettings.json is default teil von CreateDefaultBuilder

Warum brauchst Du überhaupt die Umgebungsvariablen?
Gibt wenig empfohlene Anwendungsfälle, ausser zB. Docker.

Primär sollte man appsettings.json verwenden bzw. die Settings isoliert über den Webserver.
Systemvariablen skalieren nicht.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

So, habe jetzt die Umgebungsvariable in den PROJEKT Settings in Visual Studio gesetzt, und jetzt findet AddEnvironmentVariables() die Umgebungsvariable.

Könnte es sein, dass wir aneinander vorbei geredet haben, und diese Funktion nur die Umgebungsvariable des Projekts nutzt, und gar nicht in der Lage ist die Umgebungsvariablen meines RECHNERS auszulesen?

16.835 Beiträge seit 2008
vor 4 Jahren

kA was Du da machst, aber AddEnvironmentVariables sind die Umgebungsvariablen des Rechners (oder bei Docker die des Containers).
Steht wie gesagt auch so 1:1 in der Doku.

Mir ist aber insgesamt ein Rätsel, was Du da machst.
Ich hab persönlich ausserhalb von Docker noch nie AddEnvironmentVariables gebraucht - gibt auch nur sehr sehr sehr wenig Szenarien dafür.

Nimm Dir doch mal Zeit und les Dir durch, welche Ebenen es in ASP.NET Core für die Konfiguration gibt.
Ich glaube, dass Du das noch nicht so ganz verstanden hast...

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Habe in der Doku gelesen, dass es sowas gibt, und habe dann halt versucht das Gelernte anzuwenden, quasi als Lernerfolgskontrolle.

Was ich halt soweit Verstanden habe ist, dass die Konfiguration einem Factory Pattern unterliegt, die möglichen Konfigurationen durch Add-Methoden hinzugefügt werden, und das Configurations Objekt dann durch Aufruf der Build() Methode erzeugt wird.

Das Optionen Muster werde ich mir noch mal durchlesen, hatte das schon mal angefangen, war aber zu unkonzentriert, dieser ganze scheiß Ärger hier rund um den SC Paderborn und RBL lässt einen derzeit fast in Dauerschleife Twitter, Forum und Facebook checken. Ärgert mich selbst, dass ich gerade kaum vorwärts komme ...

16.835 Beiträge seit 2008
vor 4 Jahren

Aber warum willst Du die Konfiguration über Umgebungsvariablen des Betriebssystems machen - und nicht wie üblich über die appsettings.json?
Das ist auch das Standardverhalten aller ASP.NET Core Projektvorlagen in Visual Studio und in der dotnet CLI.

Umgebungsvariablen des Betriebssystems verwendet man wie gesagt nur für ganz bestimmte Anwendungsfälle.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Aus keinem konkreten Nutzen. Habe mir ein Anwendungsszenario ausgedacht und habe das dann versucht umzusetzen, inklusive Dependency Injection in eine Razor Page. 😃

Learning by doing 😉

Das Auslesen aus der appsettings.json hatte ja geklappt.

16.835 Beiträge seit 2008
vor 4 Jahren

Ah, dann gib bitte nächstes Mal auch die Info dazu, dass es ne Lernsache ist.
Danke. 👍