Jak odczytywać wartości AppSettings z pliku .json w ASP.NET Core


247

Skonfigurowałem moje dane AppSettings w pliku appsettings / Config .json w następujący sposób:

{
  "AppSettings": {
        "token": "1234"
    }
}

Szukałem online, jak odczytać wartości AppSettings z pliku .json, ale nie znalazłem nic przydatnego.

Próbowałem:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

Wiem, że dzięki ASP.NET 4.0 możesz to zrobić:

System.Configuration.ConfigurationManager.AppSettings["token"];

Ale jak to zrobić w programie ASP.NET Core?




można to nawet uprościć, stosując wstrzykiwanie zależności konfiguracji IC (w .net core 2.0). Co zostało wyjaśnione tutaj coding-issues.com/2018/10/…
— Ranadheer Reddy

@RanadheerReddy, wstrzykiwanie zależności działa dla kontrolerów. Ale co jeśli ktoś musi odczytać wartość w oprogramowaniu pośrednim?
— Alexander Ryan Baggett,

Odpowiedzi:


320

To miało kilka zwrotów akcji. Zmodyfikowałem tę odpowiedź, aby była na bieżąco z ASP.NET Core 2.0 (od 26.02.2018).

Jest to głównie zaczerpnięte z oficjalnej dokumentacji :

Aby pracować z ustawieniami w aplikacji ASP.NET, zaleca się tworzenie instancji tylko Configurationw Startupklasie aplikacji . Następnie użyj wzorca Opcje, aby uzyskać dostęp do poszczególnych ustawień. Powiedzmy, że mamy appsettings.jsonplik, który wygląda następująco:

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

I mamy obiekt POCO reprezentujący konfigurację:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

Teraz budujemy konfigurację w Startup.cs:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }
}

Pamiętaj, że appsettings.jsonzostanie domyślnie zarejestrowany w .NET Core 2.0. W appsettings.{Environment}.jsonrazie potrzeby możemy również zarejestrować plik konfiguracyjny dla każdego środowiska.

Jeśli chcemy wprowadzić naszą konfigurację do naszych kontrolerów, będziemy musieli zarejestrować ją w środowisku wykonawczym. Robimy to poprzez Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

I wstrzykujemy to w ten sposób:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

Pełna Startupklasa:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}

3
wersja "1.0.0-beta4"działa na mojej nie "1.0.0-alpha4". Wielkie dzięki!
— Oluwafemi,

2
Muszę przekazać ustawienie do innej warstwy z klasy narzędzia, więc potrzebuję czegoś takiego jak ten publiczny ciąg statyczny GetConnectionString () {if (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json „); Configuration = builder.Build (); connectionString = Configuration.Get ("Data: DefaultConnection: ConnectionString"); }} return connectionString; }
— dnxit

2
DostajęArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
— Peter

5
Po dodaniu nugetu Microsoft.Extensions.Options.ConfigurationExtensionsdziałało zgodnie z oczekiwaniami.
— Peter

2
Ładne wyjaśnienie logiki procesu konfiguracji, ale brakuje w niej głównej kwestii: SetBasePath () i AddJsonFile () to metody rozszerzeń, głęboko osadzone w strukturze w oddzielnych zestawach. Aby więc zacząć, oprócz Microsoft.Extensions.Configuration należy zainstalować Microsoft.Extensions.Configuration.FileExtensions i Microsoft.Extensions.Configuration.Json.
— Bozhidar Stoyneff

63

Po pierwsze: nazwa zestawu i przestrzeń nazw Microsoft.Framework.ConfigurationModel zmieniły się na Microsoft.Framework.Configuration. Więc powinieneś użyć: np

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

jako zależność w project.json. Użyj wersji beta5 lub 6, jeśli nie masz zainstalowanej wersji 7. Następnie możesz zrobić coś takiego wStartup.cs .

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

Jeśli następnie chcesz pobrać zmienną z pliku config.json, możesz uzyskać ją od razu, używając:

public void Configure(IApplicationBuilder app)
{
    // Add .Value to get the token string
    var token = Configuration.GetSection("AppSettings:token");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
    });
}

lub możesz utworzyć klasę o nazwie AppSettings, taką jak ta:

public class AppSettings
{
    public string token { get; set; }
}

i skonfiguruj takie usługi:

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

a następnie uzyskać do niego dostęp za pośrednictwem np. kontrolera takiego:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}

czy możesz udostępnić konfigurację json dla „AppSettings” w celach informacyjnych
— Ankit Mori

Potrzebuję całej konfiguracji appSettings.json w klasie, w tym celu zaprojektowałem klasę zgodnie z JSON i użyłem Configuration.Get<AppSettings>()do deserializacji całego pliku zamiast określonej sekcji.
— Nilay

52

W przypadku .NET Core 2.0 wszystko się nieco zmieniło. Konstruktor uruchamiania przyjmuje jako parametr obiekt konfiguracji, więc użycie ConfigurationBuildernie jest wymagane. Tu jest moje:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

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)
{
    services.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

Mój POCO to StorageOptionsobiekt wymieniony na górze:

namespace FictionalWebApp.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

Konfiguracja jest tak naprawdę podsekcją mojego appsettings.jsonpliku o nazwie AzureStorageConfig:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "fictionalwebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

Jedyne, co dodam, to to, że odkąd konstruktor się zmienił, nie testowałem, czy trzeba zrobić coś dodatkowego, aby można go było załadować appsettings.<environmentname>.jsonw przeciwieństwie do tego appsettings.json.


Tylko uwaga, że ​​nadal musisz podrzucić plik .AddJsonFile („twojplik.json”) do ConfigConfiguration. IE, musisz powiedzieć, gdzie jest plik. Nie widziałem tego w odpowiedzi.
— Eric

Eric Ponownie to przetestuję, nie pamiętam dodania tego wiersza; Czy może to być konieczne tylko wtedy, gdy nazwa pliku json nie jest nazwą domyślną?
— MDMoore313

Według MSDN nie jest to wymagane dla ASPNETCORE 2.0, chociaż wydaje się, że nie działa również dla mnie. docs.microsoft.com/en-us/dotnet/api/…
— Sat

1
Mogę potwierdzić, że musiałem zbudować obiekt ConfigurationBuilder () i wywołać AddJSONFile (), aby załadować pliki appSettings.json do słownika konfiguracji. To jest ASP.NET Core 2.0. Czy to błąd, ponieważ działa wbrew temu, co mówi MSDN?
— sob. Thiru

1
Czy możesz podać przykład, w jaki sposób wstrzykujesz StorageOptions do kontrolerów? Jeśli zastosuję podejście typu uścisk przy użyciu wstrzykiwania zależności public HomeController(IOptions<StorageOptions> settings), otrzymuję następujący komunikat o błędzie: Typy złożone związane z modelem nie mogą być abstrakcyjne lub typu wartości i muszą mieć konstruktor bez parametrów.
— Jpsy

30

Z .NET Core 2.2 i w najprostszy możliwy sposób ...

public IActionResult Index([FromServices] IConfiguration config)
{
    var myValue = config.GetValue<string>("MyKey");
}

appsettings.jsonjest automatycznie ładowany i dostępny za pośrednictwem konstruktora lub wstrzyknięcia akcji, a także GetSectionmetoda IConfiguration. Nie ma potrzeby zmieniać Startup.csani Program.csjeśli potrzebujesz tylko appsettings.json.


2
jeszcze prościej:var myValue = config["MyKey"]
— jokab

... i możesz zrobić: config [„Storage: ConnectionString”], aby uzyskać elementy wewnątrz json. Mogę potwierdzić, że ta technika działa na .net core 3 i działa na iniekcji konstrukcyjnej.
— Mário Meyrelles,

29

Jeśli chcesz tylko uzyskać wartość tokena, użyj

Configuration["AppSettings:token"]


4
Aby to zadziałało, musisz wcześniej zainicjować instancję IConfiguracji za pomocą ConfigurationBuilder.
— Г Г И І И О

20

.NET Core 3.0

Może nie jest to najlepszy sposób na uzyskanie wartości z pliku appsettings.json , ale jest prosty i działa w mojej aplikacji !!

Plik appsettings.json

{
    "ConnectionStrings": {
        "DefaultConnection":****;"
    }

    "AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

Kontroler:

Na górze :

using Microsoft.Extensions.Configuration;

W twoim kodzie:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];

Całkiem proste. Dziękuję za to, pomogłeś mi!
— Matt

AddJsonFile nie istnieje w ConfigurationBuilder
— Essej

10

Poniższe działa w przypadku aplikacji konsolowych;

  1. Zainstaluj następujące pakiety NuGet ( .csproj);

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
    </ItemGroup>
  2. Utwórz appsettings.jsonna poziomie katalogu głównego. Kliknij go prawym przyciskiem myszy i wybierz „Kopiuj do katalogu wyjściowego” jako „ Kopiuj, jeśli nowszy ”.

  3. Przykładowy plik konfiguracyjny:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Program.cs

    configurationSection.Keyi configurationSection.Valuebędzie miał właściwości konfiguracyjne.

    static void Main(string[] args)
    {
        try
        {
    
            IConfigurationBuilder builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
            IConfigurationRoot configuration = builder.Build();
            // configurationSection.Key => FilePath
            // configurationSection.Value => C:\\temp\\logs\\output.txt
            IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

8

W przypadku .NET Core 2.0 możesz po prostu:

Zadeklaruj pary klucz / wartość w appsettings.json:

{
  "MyKey": "MyValue"
}

Wstrzyknij usługę konfiguracyjną do startup.cs i uzyskaj wartość za pomocą usługi

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });

8

Wątpię, czy to dobra praktyka, ale działa lokalnie. Zaktualizuję to, jeśli zakończy się niepowodzeniem podczas publikowania / wdrażania (w usłudze sieci Web IIS).

Krok 1 - Dodaj ten zestaw na początek swojej klasy (w moim przypadku klasa kontrolera):

using Microsoft.Extensions.Configuration;

Krok 2 - Dodaj to lub coś podobnego:

var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json").Build();

Krok 3 - Wywołaj wartość klucza, wykonując to (zwraca ciąg znaków):

config["NameOfYourKey"]

myślę, że powinno być dobrze, pod warunkiem, że appsettings.jsonznajduje się we właściwym katalogu
— Ju66ernaut

7

Tylko w celu uzupełnienia odpowiedzi Yuval Itzchakov.

Możesz załadować konfigurację bez funkcji konstruktora, możesz ją po prostu wstrzyknąć.

public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
   Configuration = configuration;
}

6

W uzupełnieniu do istniejących odpowiedzi chciałbym wspomnieć, że czasami może to być przydatne metody rozszerzenie dlaIConfiguration dla uproszczenia.

Trzymam konfigurację JWT w appsettings.json, więc moja klasa metod rozszerzeń wygląda następująco:

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

Oszczędza to dużo linii i piszesz czysty i minimalny kod:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

Można również zarejestrować IConfigurationinstancję jako singleton i wstrzyknąć ją tam, gdzie potrzebujesz - używam kontenera Autofac, oto jak to zrobić:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

Możesz zrobić to samo z MS Dependency Injection:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

Oto pełny przypadek użycia programu ASP.NET Core!

artykuły.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>

„ASP.NET Core” Która wersja?
— Steve Smith

5

Po prostu ciągle coś zmieniają - właśnie zaktualizowali Visual Studio i mieli bombę całego projektu, w drodze do powrotu do zdrowia, a nowy sposób wygląda następująco:

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);

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

Ciągle tęsknię za tą linią!

.SetBasePath(env.ContentRootPath)

1
Jak możemy uzyskać wartości AppSettings w projektach testowych przy użyciu tego samego podejścia?
— S.Siva

2
They just keep changing things. To. Prawie każda odpowiedź na tej stronie dotyczy tylko określonej wersji .Net Core.
— Steve Smith

4

.NET Core 2.1.0

  1. Utwórz plik .json w katalogu głównym
  2. W twoim kodzie:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Zainstaluj następujące zależności:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4. WAŻNE: kliknij prawym przyciskiem myszy plik appsettings.json -> kliknij Właściwości -> wybierz Kopiuj, jeśli nowszy: wprowadź opis zdjęcia tutaj

  1. Wreszcie możesz wykonać:

    config [„key1”]

Biorąc pod uwagę, że mój plik konfiguracyjny będzie wyglądał następująco:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

2

Możesz spróbować poniżej kodu. To działa dla mnie.

public class Settings
{
    private static IHttpContextAccessor _HttpContextAccessor;

    public Settings(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static IConfigurationBuilder Getbuilder()
    {
        var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json");
        return builder;
    }

    public static string GetAppSetting(string key)
    {
        //return Convert.ToString(ConfigurationManager.AppSettings[key]);
        var builder = Getbuilder();
        var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
        return GetAppStringData;
    }

    public static string GetConnectionString(string key="DefaultName")
    {
        var builder = Getbuilder();
        var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
        return ConnectionString;
    }
}

Tutaj utworzyłem jedną klasę, aby uzyskać parametry połączenia i ustawienia aplikacji.

I Plik Startup.cs musisz zarejestrować klasę jak poniżej.

public class Startup
{

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}

2

W przypadku ASP.NET Core 3.1 możesz postępować zgodnie z tą dokumentacją:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

Podczas tworzenia nowego projektu ASP.NET Core 3.1 będziesz mieć następujący wiersz konfiguracji Program.cs:

Host.CreateDefaultBuilder(args)

Umożliwia to:

  1. ChainedConfigurationProvider: Dodaje istniejącą konfigurację IC jako źródło. W domyślnej konfiguracji dodaje konfigurację hosta i ustawia ją jako pierwsze źródło konfiguracji aplikacji.
  2. appsettings.json przy użyciu dostawcy konfiguracji JSON.
  3. appsettings.Environment.json przy użyciu dostawcy konfiguracji JSON. Na przykład appsettings.Production.json i appsettings.Development.json.
  4. Sekrety aplikacji, gdy aplikacja działa w środowisku programistycznym.
  5. Zmienne środowiskowe korzystające z dostawcy konfiguracji zmiennych środowiskowych.
  6. Argumenty wiersza polecenia za pomocą dostawcy konfiguracji wiersza polecenia.

Oznacza to, że możesz wstrzykiwać IConfigurationi pobierać wartości za pomocą klucza łańcuchowego, nawet wartości zagnieżdżonych. LubićIConfiguration ["Parent:Child"];

Przykład:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

@Ogglas ... jak wywołujący WeatherForecastController () może uzyskać klasę, która implementuje konfigurację IConfiguracja?
— Johnny Wu

1

Czy to było „oszustwo”? Właśnie ustawiłem moją konfigurację w klasie Startup na statyczną, a następnie mogę uzyskać do niej dostęp z dowolnego miejsca:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    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();
    }

    public static IConfiguration Configuration { get; set; }

1

Pobierz go do kontrolera jako obiekt przez wywołanie Get<YourType>():

public IActionResult Index([FromServices] IConfiguration config)
{
    BillModel model = config.GetSection("Yst.Requisites").Get<BillModel>();
    return View(model);
}

1

Najpierw należy wstrzyknąć IConfigurację, a następnie w celu odczytu z ustawień można użyć jednej z następujących metod:

  1. Uzyskaj dane sekcji

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Uzyskaj wartość w ramach sekcji

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Uzyskaj wartość zagnieżdżoną w sekcji

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");

Wstrzykiwanie działa w przypadku kontrolerów, ale co jeśli chcę go używać w oprogramowaniu pośrednim, takim jak tutaj ? EG Używam Redis jako oprogramowania pośredniego do buforowania odpowiedzi HTTP.
— Alexander Ryan Baggett

1

Sposób .NET Core 2.2

(Bez wątpienia Microsoft zmieni to ponownie na coś zupełnie innego w następnej wersji .NET.)

1. appSettings.json

Może to wyglądać mniej więcej tak. Tutaj załadujemy ustawienie 1 i ustawienie 2

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2) AppSettings.cs

POCO klasy trzymać Setting1 i Setting2. Będziemy ładować plik appsettings.json do tego obiektu klasy. Struktura klasy POCO powinna pasować do pliku JSON, w razie potrzeby właściwości mogą być zagnieżdżone w innych właściwościach / klasach.

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 Startup.cs

Załaduj appSettings.json do swojego obiektu AppSettings i zacznij go używać:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }

0

Dzięki najnowszej wersji Netcoreapp 3.1 możesz to zrobić po prostu bez żadnych zależności od stron trzecich.

I stworzył istotę za to , ale można użyć tej klasy do odczytu pliku JSON i powrócić właściwości dynamicznych.

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

Zrobiłem to specjalnie, aby móc użyć appconfig.json w mojej aplikacji konsolowej dotnet. Po prostu wstawiłem to do mojej Program.Mainfunkcji:

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

A to zwróci dynamicobiekt dla właściwości. (JsonElement, jeśli nie jest prymitywny). Mój appsettings.jsonplik wygląda następująco:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.