[C#] ASP.NET Core의 .json 파일에서 AppSettings 값을 읽는 방법

파일 appsettings / Config .json에서 AppSettings 데이터를 다음과 같이 설정했습니다.

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

.json 파일에서 AppSettings 값을 읽는 방법을 온라인으로 검색했지만 유용한 것을 얻을 수 없었습니다.

나는 시도했다 :

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

ASP.NET 4.0을 사용하면 다음을 수행 할 수 있습니다.

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

그러나 ASP.NET Core에서 어떻게해야합니까?



답변

이것은 약간의 꼬임이있었습니다. 이 답변을 ASP.NET Core 2.0 (2018 년 2 월 26 일 현재)으로 최신으로 수정했습니다 .

이것은 대부분 공식 문서 에서 가져온 것입니다 .

ASP.NET 응용 프로그램에서 설정 작업을하려면 Configuration응용 프로그램 Startup클래스 에서만 인스턴스를 생성하는 것이 좋습니다 . 그런 다음 옵션 패턴을 사용하여 개별 설정에 액세스하십시오. appsettings.json다음과 같은 파일이 있다고 가정 해 봅시다 .

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

}

구성을 나타내는 POCO 객체가 있습니다.

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

이제 구성을 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();
    }
}

참고 appsettings.json됩니다 기본적으로 등록 된 .NET 코어 2.0. appsettings.{Environment}.json필요한 경우 환경별로 구성 파일을 등록 할 수도 있습니다 .

구성을 컨트롤러에 주입하려면 런타임에 구성을 등록해야합니다. 우리는 통해 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"));
}

그리고 우리는 이것을 다음과 같이 주입합니다 :

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

Startup클래스 :

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


답변

우선 : Microsoft.Framework.ConfigurationModel의 어셈블리 이름과 네임 스페이스가 Microsoft.Framework.Configuration으로 변경되었습니다. 따라서 다음을 사용해야합니다.

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

의 종속성으로 project.json. 7이 설치되어 있지 않으면 beta5 또는 6을 사용하십시오. 그런 다음에서 이와 같은 작업을 수행 할 수 있습니다 Startup.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();
}

그런 다음 config.json에서 변수를 검색하려면 다음을 사용하여 즉시 가져올 수 있습니다.

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

또는 다음과 같이 AppSettings라는 클래스를 만들 수 있습니다.

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

다음과 같이 서비스를 구성하십시오.

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

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

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

다음과 같은 컨트롤러를 통해 액세스하십시오.

public class HomeController : Controller
{
    private string _token;

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


답변

.NET Core 2.0의 경우 상황이 약간 변경되었습니다. 시작 생성자는 Configuration 개체를 매개 변수로 사용하므로을 사용할 ConfigurationBuilder필요는 없습니다. 여기 내 것이있다 :

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

내 POCO는 StorageOptions상단에 언급 된 객체입니다.

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() { }
    }
}

그리고 구성은 실제로 내 appsettings.json파일 의 하위 섹션입니다 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"
  }
}

내가 추가 할 것입니다 유일한 것은 생성자가 변경된 이후, 내가 뭔가 특별한 요구가로드 될 때까지 수행 할 수 있는지 여부를 테스트하지 않은, 그이다 appsettings.<environmentname>.json반대 appsettings.json.


답변

.NET Core 2.2 및 가장 간단한 방법으로 …

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

appsettings.json생성자 또는 액션 삽입을 통해 자동으로로드되고 사용 가능하며 GetSection메소드 IConfiguration도 있습니다. 변경할 필요가 Startup.cs없거나 Program.cs필요한 것이 모두입니다 appsettings.json.


답변

토큰의 가치를 얻으려면 다음을 사용하십시오.

Configuration["AppSettings:token"]


답변

.NET 코어 3.0

아마도 appsettings.json 에서 가치를 얻는 것이 가장 좋은 방법은 아닙니다 에서 간단하고 내 응용 프로그램에서 작동합니다!

파일 appsettings.json

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

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

제어 장치:

위에 :

using Microsoft.Extensions.Configuration;

귀하의 코드에서 :

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


답변

다음은 콘솔 응용 프로그램에서 작동합니다.

  1. 다음 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. appsettings.json루트 레벨에서 작성하십시오 . 마우스 오른쪽 버튼으로 클릭하고 “출력 디렉토리에 복사 “를 ” 최신 경우 복사 “로 표시하십시오.

  3. 샘플 구성 파일 :

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

    configurationSection.KeyconfigurationSection.Value설정 속성이 있습니다.

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