Czy ConfigurationManager.AppSettings jest dostępne w programie .NET Core 2.0?

143

Mam metodę, która odczytuje ustawienia z mojego pliku konfiguracyjnego w następujący sposób:

var value = ConfigurationManager.AppSettings[key];

Kompiluje się dobrze tylko dla platformy .NET Standard 2.0.

Teraz potrzebuję wielu celów, więc zaktualizowałem plik projektu o:

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

Ale teraz kompilacja kończy się niepowodzeniem netcoreapp2.0z następującym komunikatem o błędzie:

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

Osobno utworzyłem nową aplikację konsolową .NET Core 2.0 (tym razem przeznaczoną tylko dla .NET Core 2.0), ale podobnie wydaje się, że nie ma jej ConfigurationManagerw przestrzeni nazw System.Configuration.

Jestem trochę zdezorientowany, ponieważ jest dostępny w .NET Standard 2.0, więc spodziewałbym się, że będzie dostępny w .NET Core 2.0, ponieważ .NET Core 2.0 jest zgodny z .NET Standard 2.0.

czego mi brakuje?

Alex Sanséau
źródło
11
Prawdopodobnie tego brakuje . (Zauważ, że cel .NET Standard obejmuje zarówno .NET, jak i .NET Core, więc naprawdę nie ma potrzeby tworzenia ich osobno.)
Jeroen Mostert,
Dzięki @JeroenMostert, dodanie pakietu NuGet System.Configuration.ConfigurationManager rozwiązało problem. To prawdopodobnie osobne pytanie, ale w jaki sposób .NET Core 2.0 uważa się za zgodne ze standardem .NET Standard 2.0, jeśli trzeba dodać pakiety, aby wypełnić brakujące bity?
Alex Sanséau
2
„Zgodny ze standardem .NET Standard 2.0” oznacza „jeśli zostanie utworzony pod kątem platformy .NET Standard 2.0, będzie działać na platformie .NET Core 2.0 (między innymi)”. Nie oznacza to, że „jeśli utworzysz tę wersję pod kątem platformy .NET Core 2.0, wszystkie interfejsy API platformy .NET Standard 2.0 będą dostępne bez dalszych działań”. Jeśli budować, to do standardu .NET 2.0 i nie będzie działać na .NET Core wtedy masz powód do reklamacji, ale myślę, że jest to po prostu się do pracy. (Jednak nie testowałem tego.)
Jeroen Mostert
4
@ AlexSanséau Pakiety NuGet nie są wypełnieniami poli. Rozpoczynając pracę nad .NET Core Microsoft podjął decyzję o opt-in API, co oznacza, że ​​Twoje aplikacje zajmują mniej miejsca. Poleciłbym poświęcić trochę czasu i obejrzeć filmy, które Immo Landwerth stworzył na .NET Standard ( youtube.com/… ) - jest PM w zespole .NET Standard
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- to nie może być poprawne, ponieważ ConfigurationManagernie jest częścią standardu .NET (na razie dotyczy to wersji 2.1).
G. Stoynev

Odpowiedzi:

268

Tak, ConfigurationManager.AppSettingsjest dostępny w .NET Core 2.0 po odwołaniu się do pakietu NuGet System.Configuration.ConfigurationManager.

Podziękowania dla @JeroenMostert za dostarczenie mi rozwiązania.

Alex Sanséau
źródło
1
Czy możesz wysłać kod z pliku konfiguracyjnego? Próbuję dowiedzieć się, jak / gdzie ustawić zmienną globalną w .NET Core 2.0
egmfrs
1
@egmfrs, czy mógłbyś zmienić frazę? Zmienne globalne istniałyby w postaci statycznych właściwości klasy. Pliki konfiguracyjne zawierają ustawienia aplikacji w ich zwykłym formacie:<add key="YourSetting" value="YourValue" />
Alex Sanséau
2
@ AlexSanséau, próbuję dowiedzieć się, gdzie mogę ustawić wartości dla AppSettings. web.config lub appsettings.json nie działa. Czy możesz podać przykład, gdzie ustawić AppSettings? Dzięki.
Jan Deutschl
2
@JanDeutschl, powinien przejść do sekcji appSettings w pliku web.config lub app.config, tak jak w przypadku tradycyjnego projektu .NET.
Alex Sanséau
8
Jestem trochę zdezorientowany. To jest wymienione .NET Framework 4.6jako zależność. Czy to oznacza, że ​​mój projekt „.NET Core” nie jest już czystym Coreprojektem?
James Poulose
20

Zainstalowałem System.Configuration.ConfigurationManagerz Nuget w mojej aplikacji .net core 2.2.

Następnie odwołuję się using System.Configuration;

Następnie zmieniłem się

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Jak dotąd uważam, że to prawda. 4.5.0 is typical with .net core 2.2

Nie miałem z tym żadnych problemów.

Tom Stickel
źródło
Jedna z łatwych poprawek do migracji. Niektóre inne nie są takie fajne: /
Tom Stickel
czy utworzyłeś również plik web.config?
swedish_junior_dev
2
to nie działa dla mnie (.net core 3.1). nie ma żadnych danych ustawień, jeśli dostęp
arteny
@Arteny - nigdy nie testowałem tego z 3.1 - zainstalowałem 3.1 i bawiłem się nim w domu - ale mój obecny klient nie chce w najbliższym czasie uaktualnić.
Tom Stickel
9

Po skonfigurowaniu pakietów musisz utworzyć plik app.config lub web.config i dodać coś podobnego do następującego:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>
Sharpiro
źródło
7

Najnowszy zestaw wskazówek jest następujący: (z https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Posługiwać się:

System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

Z dokumentów:

public static class EnvironmentVariablesExample
{
    [FunctionName("GetEnvironmentVariables")]
    public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
        log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
    }

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }
}

Ustawienia aplikacji można odczytać ze zmiennych środowiskowych zarówno podczas tworzenia lokalnego, jak i podczas uruchamiania na platformie Azure. Podczas programowania lokalnego ustawienia aplikacji pochodzą z Valueskolekcji w pliku local.settings.json . W obu środowiskach, lokalnym i Azure, GetEnvironmentVariable("<app setting name>")pobiera wartość ustawienia nazwanej aplikacji. Na przykład, gdy pracujesz lokalnie, zwrócona zostanie wartość „Nazwa mojej witryny”, jeśli plik local.settings.json zawiera { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

Właściwość System.Configuration.ConfigurationManager.AppSettings to alternatywny interfejs API do pobierania wartości ustawień aplikacji, ale zalecamy użycie, GetEnvironmentVariablejak pokazano tutaj.

Nate Radebaugh
źródło
Dla każdego, kto to using static System.Environment;
wypróbuje
1

Możesz użyć konfiguracji, aby rozwiązać ten problem.

Np. (Startup.cs):

Po tej implementacji możesz przekazać DI do kontrolerów.

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();

    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        var microserviceName = Configuration["microserviceName"];

       services.AddSingleton(Configuration);

       ...
    }
Frederico Freitas
źródło