wake-up-neo.com

Zugriff auf die Einstellungen von Web.config in der Asp.Net Core App?

Ich verstehe, dass asp.net core ein neues Konfigurationssystem hat, das sehr flexibel ist und das großartig ist. Aber es gibt Dinge, die ich an dem web.config-basierten Konfigurationssystem von .net 4.x mag. Beispielsweise kann man Kommentare in die Datei web.config einfügen, da es sich um eine XML-Datei handelt. Und das ist es für mich wert, bei xml zu bleiben, anstatt den glänzenden neuen json-Ansatz zu wählen. [pdate: Ich verstehe jetzt, dass der json-Ansatz auch Kommentare in der Datei unterstützt.]

Wenn ich also ein Asp.Net Core-Webprojekt habe, das auf das gesamte Framework abzielt, sollte ich anscheinend den web.config-basierten Ansatz System.Configuration.ConfigurationManager.AppSettings[key] Verwenden können, um eine Einstellung zu erhalten.

Aber wenn ich es versuche, kommt der Wert immer auf null zurück (zumindest mit IIS express using VS2015).

Es sollte richtig funktionieren? Irgendwelche Gedanken darüber, was ich überblicken könnte?

Web.config

<configuration>
    <appSettings>
        <add key="SomeSetting" value="true"/>
    </appSettings>

    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>

        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
     </system.webServer>
</configuration>

Code für die Zugriffseinstellung:

string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");

UPDATE
Nach weiteren Nachforschungen verstehe ich jetzt , warum es nicht funktioniert, aber ich habe immer noch keinen Weg gefunden, es zu beheben. Die Hauptursache scheint darin zu liegen, dass der ConfigurationManager die Konfigurationsinformationen in einer anderen Datei und nicht in der Datei web.config sucht.

Dies ist an der Eigenschaft AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Zu erkennen. In meinem Fall zeigt es statt auf website_folder\web.config Auf website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Config, Wobei website_folder der Pfad zu dem Ordner ist, der meine Website enthält.

Die Dokumentation und Intellisense sagen, dass AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Eine einstellbare Eigenschaft ist, aber wenn ich versuche, finde ich, dass diese Einstellung ihren Wert nicht ändert. Sehr komisch.

Also, während ich jetzt sehe, was das Problem ist, kann ich anscheinend keinen Weg finden, es zu beheben.

33
Ron C

Ich habe irgendwie die Lösung gefunden. Der Schlüssel, um dies herauszufinden, war zu erkennen, dass die Eigenschaft AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Nicht auf die Datei web.config, sondern auf die Datei exe.config für die ausführbare Datei verweist, die die Website ausführt. Denken Sie daran, dass die Website unter .net core in einem eigenen Prozess ausgeführt wird und eine eigene Exe hat.

Das Konfigurationsmodell, das .Net 4.x mit dem ConfigurationManager verwendet, ähnelt also eher einer Desktop-App als einer 4.x-Webanwendung. Damit meine ich, dass es sich bei der exe.config nicht um die web.config handelt.

Dann bemerkte ich, dass das Asp.Net Core-Webprojekt (unter Verwendung des vollständigen Frameworks) eine app.config-Datei enthält, ähnlich wie eine Desktop-App. Und es stellt sich heraus, dass, wenn Sie Ihre .net 4.x-Anwendungskonfigurationseinstellungen in diese Datei einfügen, diese beim Generieren der Exe in die exe.config-Datei eingefügt werden, unabhängig davon, ob sie zum Debuggen oder zur Veröffentlichung bestimmt sind. Genau so, wie es zum Beispiel mit einer Win Forms App funktioniert.

Um den ConfigurationManager in einer asp.net-Kernwebanwendung zu verwenden, die auf das gesamte Framework abzielt, müssen Sie die Anwendungseinstellung in die Datei app.config und nicht in die Datei web.config einfügen. Der ConfigurationManager findet sie kein Problem.

enter image description here

Obwohl dies viel erklärt, bietet es immer noch nicht die Möglichkeit, diese Einstellungen in die web.config zu übernehmen und über den ConfigurationManager darauf zuzugreifen. Aber ich fange an zu glauben, dass dies in einer asp.net-Kernwebanwendung nicht möglich ist, selbst wenn sie auf das gesamte Framework abzielt.

36
Ron C

Ich bin auch auf dieses Problem gestoßen. Nach einigen Nachforschungen und Lektüren können Sie die Datei web.config manuell hinzufügen. Hier werden jedoch die Einstellungen für IIS (z. B. Authentifizierung, ...) vorgenommen.

Für die Appsettings oder benutzerdefinierten Einstellungen müssen Sie mit der Datei appsettings.json und der neuen Konfiguration in .Net Core arbeiten.

Microsoft-Dokumentation

3
jawa

Dieses Problem trat auf, als ich mit der Veröffentlichung meiner asp.net core 1.1-Anwendung in IIS begann.
Auf der Datei IIS, die beim Veröffentlichen überschrieben wurde. Um die Windows-Authentifizierung zu aktivieren, musste ich eine web.config manuell hinzufügen = zu meinem Projekt. Dieses wird korrekt in IIS veröffentlicht:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\yourproject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>
3
Yush0