.net 코어의 appsettings.json에서 가치 얻기


162

여기서 누락 된 것이 확실하지 않지만 .net 핵심 응용 프로그램의 appsettings.json에서 값을 가져올 수 없습니다. appsettings.json은 다음과 같습니다.

{
    "AppSettings": {
        "Version": "One"
    }
}

시작 :

public class Startup
{
    private IConfigurationRoot _configuration;
    public Startup(IHostingEnvironment env)
    {
        _configuration = new ConfigurationBuilder()
    }
    public void ConfigureServices(IServiceCollection services)
    {
      //Here I setup to read appsettings        
      services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
    }
}

모델:

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

제어 장치:

public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

    public HomeController(IOptions<AppSettings> settings)
    {
        //This is always null
        _mySettings = settings.Value;
    }
}

_mySettings항상 null입니다. 내가 여기서 놓친 것이 있습니까?


3
제발 설명서를 읽어 구성을 사용하는 방법에 있습니다. 시작 클래스에서 구성을 잘못 설정했습니다.
poke

설명서 주셔서 감사합니다. 도움이되었습니다.
aman

IConfiguration의 의존성 주입을 사용하여 간단히 단순화 할 수도 있습니다. 이는 여기에 설명 coding-issues.com/2018/10/...
Ranadheer 레디에게

답변:


229

프로그램 및 스타트 업 수업

.NET 코어 2.x

생성자 IConfiguration에서 새로 만들 필요는 없습니다 Startup. 그 구현은 DI 시스템에 의해 주입 될 것입니다.

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();            
}

// Startup.cs
public class Startup
{
    public IHostingEnvironment HostingEnvironment { get; private set; }
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        this.HostingEnvironment = env;
        this.Configuration = configuration;
    }
}

.NET 코어 1.x

Startupappsettings 파일을로드하도록 지시 해야 합니다.

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

        host.Run();
    }
}

//Startup.cs
public class Startup
{
    public IConfigurationRoot Configuration { get; private set; }

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

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

가치 얻기

앱 설정에서 구성하는 값을 얻는 방법에는 여러 가지가 있습니다.

  • 사용하는 간단한 방법 ConfigurationBuilder.GetValue<T>
  • 옵션 패턴 사용

당신의 appsettings.json모습이 다음과 같다고 가정 해 봅시다 .

{
    "ConnectionStrings": {
        ...
    },
    "AppIdentitySettings": {
        "User": {
            "RequireUniqueEmail": true
        },
        "Password": {
            "RequiredLength": 6,
            "RequireLowercase": true,
            "RequireUppercase": true,
            "RequireDigit": true,
            "RequireNonAlphanumeric": true
        },
        "Lockout": {
            "AllowedForNewUsers": true,
            "DefaultLockoutTimeSpanInMins": 30,
            "MaxFailedAccessAttempts": 5
        }
    },
    "Recaptcha": { 
        ...
    },
    ...
}

간단한 방법

전체 구성을을 통해 컨트롤러 / 클래스의 생성자에 주입하고 IConfiguration지정된 키로 원하는 값을 얻을 수 있습니다.

public class AccountController : Controller
{
    private readonly IConfiguration _config;

    public AccountController(IConfiguration config)
    {
        _config = config;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _config.GetValue<int>(
                "AppIdentitySettings:Password:RequiredLength"),
            RequireUppercase = _config.GetValue<bool>(
                "AppIdentitySettings:Password:RequireUppercase")
        };

        return View(vm);
    }
}

옵션 패턴

ConfigurationBuilder.GetValue<T>경우에만 응용 프로그램 설정에서 하나 개 또는 두 개의 값을 필요로하는 경우 잘 작동합니다. 그러나 앱 설정에서 여러 값을 가져 오거나 해당 키 문자열을 여러 위치에 하드 코딩하지 않으려면 옵션 패턴 을 사용하는 것이 더 쉬울 수 있습니다 . 옵션 패턴은 클래스를 사용하여 계층 / 구조를 나타냅니다.

옵션 패턴을 사용하려면

  1. 구조를 나타내는 클래스 정의
  2. 해당 클래스가 바인딩하는 구성 인스턴스를 등록하십시오.
  3. IOptions<T>값을 얻으려는 컨트롤러 / 클래스의 생성자에 주입 하십시오.

1. 구조를 나타내는 구성 클래스 정의

앱 설정의 키 와 정확히 일치해야하는 속성으로 클래스를 정의 할 수 있습니다 . 클래스 이름이 앱 설정의 섹션 이름과 일치하지 않아도됩니다.

public class AppIdentitySettings
{
    public UserSettings User { get; set; }
    public PasswordSettings Password { get; set; }
    public LockoutSettings Lockout { get; set; }
}

public class UserSettings
{
    public bool RequireUniqueEmail { get; set; }
}

public class PasswordSettings
{
    public int RequiredLength { get; set; }
    public bool RequireLowercase { get; set; }
    public bool RequireUppercase { get; set; }
    public bool RequireDigit { get; set; }
    public bool RequireNonAlphanumeric { get; set; }
}

public class LockoutSettings
{
    public bool AllowedForNewUsers { get; set; }
    public int DefaultLockoutTimeSpanInMins { get; set; }
    public int MaxFailedAccessAttempts { get; set; }
}

2. 구성 인스턴스 등록

그런 다음 ConfigureServices()시작시이 구성 인스턴스를 등록해야 합니다.

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...

namespace DL.SO.UI.Web
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var identitySettingsSection = 
                _configuration.GetSection("AppIdentitySettings");
            services.Configure<AppIdentitySettings>(identitySettingsSection);
            ...
        }
        ...
    }
}

3. I 옵션 주입

마지막으로 컨트롤러 / 클래스에서 값을 얻으려면 IOptions<AppIdentitySettings>생성자를 통해 주입해야합니다 .

public class AccountController : Controller
{
    private readonly AppIdentitySettings _appIdentitySettings;

    public AccountController(IOptions<AppIdentitySettings> appIdentitySettingsAccessor)
    {
        _appIdentitySettings = appIdentitySettingsAccessor.Value;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
            RequireUppercase = _appIdentitySettings.Password.RequireUppercase
        };

        return View(vm);
    }
}

내 데이터를 보유한 클래스의 값에 어떻게 액세스 할 수 있습니까?
Lukas Hieronimus Adler

1
@LukasHieronimusAdler : IOptionsSnapshot<T>대신에 사용하고 싶을 수도 있습니다 IOptions<T>. 이 문서에서 좀 걸릴 수 있습니다 : offering.solutions/blog/articles/2017/02/17/...를 . 그래도 직접 시도해 볼 기회는 없었습니다.
David Liang

2
스 니펫처럼 간단하게 만들 수 있습니까?
Syaiful Nizam Yahya

8
무엇 전체 스택 .NET에서 끔찍한 단계 뒤로
아론

4
.NET Core 3의 경우 Microsoft.Extensions.Options.ConfigurationExtensions 패키지가 필요하며 제대로 작동합니다.
Tomas Bruckner

50

AnyName.cs 파일을 만들고 다음 코드를 붙여 넣으십시오.

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace Custom
{
    static class ConfigurationManager
    {
        public static IConfiguration AppSetting { get; }
        static ConfigurationManager()
        {
            AppSetting = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("YouAppSettingFile.json")
                    .Build();
        }
    }
}

YouAppSettingFile.json 파일 이름을 파일 이름으로 바꿔야합니다.
.json 파일은 다음과 같아야합니다.

{
    "GrandParent_Key" : {
        "Parent_Key" : {
            "Child_Key" : "value1"
        }
    },
    "Parent_Key" : {
        "Child_Key" : "value2"
    },
    "Child_Key" : "value3"
}

이제 사용할 수 있습니다. 수업에 참고 자료
추가하는 것을 잊지 마십시오 .

using Custom;

값을 검색하는 코드입니다.

string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];

3
프로덕션 환경에서는 이것을 사용하지 마십시오. 이 접근 방식은 웹 API에서 메모리 누수를 일으켰습니다. netcore를 사용하는 경우 문자 그대로 IConfiguration을 주입 할 수 있습니다. 위의 답변을 참조하십시오.
André Mantas

49

Core 2.0에 대한 David Liang의 답변 추가 -

appsettings.json파일은 ASPNETCORE_ENVIRONMENT변수 에 연결됩니다 .

ASPNETCORE_ENVIRONMENT는 임의의 값으로 설정할 수 있지만 프레임 워크 DevelopmentStaging,, 및 세 개의 값을 지원합니다 Production. 경우 ASPNETCORE_ENVIRONMENT설정되지 않은, 그것은에 기본값으로 사용합니다 Production.

이 세 값의 이러한 appsettings.ASPNETCORE_ENVIRONMENT.json의 파일은 상자 밖으로 지원 - appsettings.Staging.json, appsettings.Development.jsonappsettings.Production.json

위의 세 가지 응용 프로그램 설정 json 파일을 사용하여 여러 환경을 구성 할 수 있습니다.

예 - appsettings.Staging.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "MyConfig": "My Config Value for staging."
}

Configuration["config_var"]구성 값을 검색하는 데 사용하십시오 .

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        Environment = env;
        Configuration = config;
        var myconfig = Configuration["MyConfig"];
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment Environment { get; }
}

1
중첩 된 객체는 어떻습니까?
Arthur Attout

8
중첩 된 개체를 구성하여 얻을 수있다 "MyConfig를 : SomethingNested"]
WeHaveCookies

1
github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/… 파일에서 볼 수 있듯이 ASP.NET Core는 현재 appsettings.json+를 로드합니다 appsettings.{env.EnvironmentName}.json. 따라서 ASP.NET Core가 Development, Staging 및 Production appsettings.json 파일 만로드한다는 설명은 현재 올바르지 않습니다.
mvdgun

1
그래서 ASPNETCORE_ENVIRONMENT매번 Windows 변수를 설정해야 합니까? .Net 4에서는 훨씬 쉬웠습니다.이 JSON 광신자들은 큰 시간을 허비했습니다
툴킷

@Toolkit 환경 변수를 전역 적으로 설정할 수 있습니다. docs.microsoft.com/ko-kr/aspnet/core/fundamentals/…
Aseem Gautam

29

가장 간단한 방법은 DI입니다. 컨트롤러에 도달하는 예입니다.

// StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
    ...
    // for get appsettings from anywhere
    services.AddSingleton(Configuration);
}

public class ContactUsController : Controller
{
    readonly IConfiguration _configuration;

    public ContactUsController(
        IConfiguration configuration)
    {
        _configuration = configuration;

        // sample:
        var apiKey = _configuration.GetValue<string>("SendGrid:CAAO");
        ...
    }
}

5
다른 답변을 읽으면 이것이 가장 좋습니다.
harveyt

내가 없어진 services.AddSingleton(Configuration);지금은 작동
아서 메데이로스

12

Startup 클래스의 생성자에서 주입 된 IConfiguration 객체를 사용하여 appsettings.json 및 기타 여러 설정에 액세스 할 수 있습니다.

Startup.cs 생성자

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;

        //here you go
        var myvalue = Configuration["Grandfather:Father:Child"];

    }

public IConfiguration Configuration { get; }

appsettings.json의 내용

  {
  "Grandfather": {
    "Father": {
      "Child": "myvalue"
    }
  }

2
'Configuration [ "Grandfather : Father : Child"]'구문이 도움이되었습니다.
Jacques Olivier

2
이것은 구조적이고 명확하며 요점에 대한 탁월한 답변입니다. 훌륭한 의사 소통
jolySoft

6
    public static void GetSection()
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .Build();

        string BConfig = Configuration.GetSection("ConnectionStrings")["BConnection"];

    }

4
불완전한 답변
Carlos ABS

1

필자의 경우 Configuration 객체에서 Bind () 메서드를 사용하는 것이 간단했습니다. 그런 다음 DI에서 개체를 싱글 톤으로 추가하십시오.

var instructionSettings = new InstructionSettings();
Configuration.Bind("InstructionSettings", instructionSettings);
services.AddSingleton(typeof(IInstructionSettings), (serviceProvider) => instructionSettings);

Instruction 객체는 원하는만큼 복잡 할 수 있습니다.

{  
 "InstructionSettings": {
    "Header": "uat_TEST",
    "SVSCode": "FICA",
    "CallBackUrl": "https://UATEnviro.companyName.co.za/suite/webapi/receiveCallback",
    "Username": "s_integrat",
    "Password": "X@nkmail6",
    "Defaults": {
    "Language": "ENG",
    "ContactDetails":{
       "StreetNumber": "9",
       "StreetName": "Nano Drive",
       "City": "Johannesburg",
       "Suburb": "Sandton",
       "Province": "Gauteng",
       "PostCode": "2196",
       "Email": "ourDefaultEmail@companyName.co.za",
       "CellNumber": "0833 468 378",
       "HomeNumber": "0833 468 378",
      }
      "CountryOfBirth": "710"
    }
  }

1

ASP.NET Core 3.1의 경우이 가이드를 따를 수 있습니다.

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

새 ASP.NET Core 3.1 프로젝트를 만들면 다음과 같은 구성 줄이 있습니다 Program.cs.

Host.CreateDefaultBuilder(args)

이를 통해 다음을 수행 할 수 있습니다.

  1. ChainedConfigurationProvider : 기존 IConfiguration을 소스로 추가합니다. 기본 구성의 경우 호스트 구성을 추가하고 앱 구성의 첫 번째 소스로 설정합니다.
  2. JSON 구성 제공자를 사용하는 appsettings.json
  3. JSON 구성 제공자를 사용하는 appsettings.Environment.json 예를 들어 appsettings.Production.json 및 appsettings.Development.json입니다.
  4. 앱이 개발 환경에서 실행될 때 앱 비밀.
  5. 환경 변수 구성 제공자를 사용하는 환경 변수.
  6. 명령 줄 구성 공급자를 사용하는 명령 줄 인수

IConfiguration, 문자열 키를 사용하여 값을 삽입 하고 가져올 수 있으며 중첩 된 값도 가능합니다. 처럼IConfiguration["Parent:Child"];

예:

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

IConfiguration["Parent:Child"]구문 에 대한 자세한 정보는 어디서 얻을 수 있습니까 ?
xr280xr

0

가장 좋은 옵션은 다음과 같습니다.

  1. 구성 스키마로 모델 클래스 작성

  2. DI에 등록하십시오. services.Configure (Configuration.GetSection ( "democonfig"));

  3. 컨트롤러의 DI에서 모델 객체로 값을 가져옵니다.

    private readonly your_model myConfig;
    public DemoController(IOptions<your_model> configOps)
    {
        this.myConfig = configOps.Value;
    }

0

Asp.net 코어 2.2 이상에서 다음과 같이 코딩 할 수 있습니다.

1 단계. AppSettings 클래스 파일을 만듭니다.

이 파일에는 appsettings.json 파일에서 키로 가치를 얻는 데 도움이되는 몇 가지 방법이 포함되어 있습니다. 아래 코드처럼 보입니다 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ReadConfig.Bsl
{
  public class AppSettings
  {
      private static AppSettings _instance;
      private static readonly object ObjLocked = new object();
      private IConfiguration _configuration;

      protected AppSettings()
      {
      }

      public void SetConfiguration(IConfiguration configuration)
      {
          _configuration = configuration;
      }

      public static AppSettings Instance
      {
          get
          {
              if (null == _instance)
              {
                  lock (ObjLocked)
                  {
                      if (null == _instance)
                          _instance = new AppSettings();
                  }
              }
              return _instance;
          }
      }

      public string GetConnection(string key, string defaultValue = "")
      {
          try
          {
              return _configuration.GetConnectionString(key);
          }
          catch
          {
              return defaultValue;
          }
      }

      public T Get<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public T Get<T>(string key, T defaultValue)
      {
          if (_configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public static T GetObject<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
          {
              var section = Instance._configuration.GetSection(key);
              return section.Get<T>();
          }
      }

      public static T GetObject<T>(string key, T defaultValue)
      {
          if (Instance._configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
              return Instance._configuration.GetSection(key).Get<T>();
      }
  }
}

2 단계. AppSettings 객체의 초기 구성

애플리케이션이 시작될 때 appsettings.json 파일을 선언 및로드하고 AppSettings 객체의 구성 정보를로드해야합니다. Startup.cs 파일의 생성자에서이 작업을 수행합니다. 라인을 유의하십시오AppSettings.Instance.SetConfiguration(Configuration);

public Startup(IHostingEnvironment evm)
{
    var builder = new ConfigurationBuilder()
      .SetBasePath(evm.ContentRootPath)
      .AddJsonFile("appsettings.json", true, true)
      .AddJsonFile($"appsettings.{evm.EnvironmentName}.json", true)
      .AddEnvironmentVariables();
    Configuration = builder.Build(); // load all file config to Configuration property 
    AppSettings.Instance.SetConfiguration(Configuration);       
}

자, 이제 아래와 같이 키가있는 appsettings.json 파일이 있습니다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ConnectionString": "Data Source=localhost;Initial Catalog=ReadConfig;Persist Security Info=True;User ID=sa;Password=12345;"
  },
  "MailConfig": {
    "Servers": {
      "MailGun": {
        "Pass": "65-1B-C9-B9-27-00",
        "Port": "587",
        "Host": "smtp.gmail.com"
      }
    },
    "Sender": {
      "Email": "example@gmail.com",
      "Pass": "123456"
    }
  }
}

3 단계. 조치에서 구성 값 읽기

다음과 같이 데모를 홈 컨트롤러에서 동작으로 만듭니다.

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var connectionString = AppSettings.Instance.GetConnection("ConnectionString");
        var emailSender = AppSettings.Instance.Get<string>("MailConfig:Sender:Email");
        var emailHost = AppSettings.Instance.Get<string>("MailConfig:Servers:MailGun:Host");

        string returnText = " 1. Connection String \n";
        returnText += "  " +connectionString;
        returnText += "\n 2. Email info";
        returnText += "\n Sender : " + emailSender;
        returnText += "\n Host : " + emailHost;

        return Content(returnText);
    }
}

그리고 그 결과는 다음과 같습니다.

결과를 보려면 클릭

자세한 내용 은 asp.net 코어의 appsettings.json 에서 article get value를 참조 하여 자세한 코드를 참조하십시오 .


0

간단합니다 : appsettings.json에서

  "MyValues": {
    "Value1": "Xyz"
  }

.cs 파일에서 :

static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
        public static string myValue1= conf["MyValues:Value1"].ToString();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.