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?

Oluwafemi
źródło
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"));
    }
}
Yuval Itzchakov
źródło
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;
    }
}
przytulić
źródło
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.

MDMoore313
źródło
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.

tnJed
źródło
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"]

kodebot
źródło
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"];
Alexander S.
źródło
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);
        }
    }
Teoman Shipahi
źródło
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);
        });
Chris Halcrow
źródło
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"]
Eric Milliot-Martinez
źródło
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;
}
Tiago Barroso
źródło
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);
Alex Herman
źródło
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>
Alper Ebicoglu
źródło
„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)
Monolithcode
źródło
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"
}
Gregory
źródło
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);
    }
}
Jishan Siddique
źródło
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
źródło
@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; }
Brian Moore
źródło
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);
}
Lapenkov Vladimir
źródło
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");
Hamed Naeemaei
źródło
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;
    }
użytkownik1321471
źródło
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"
  }
}
Justin Gilman
źródło