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 Brazzers.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=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"AzureStorageConfig": {
"AccountName": "brazzerswebapp",
"AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
"DefaultEndpointsProtocol": "https",
"EndpointSuffix": "core.windows.net",
"StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
}
}
내가 추가 할 유일한 것은 생성자가 변경 되었기 때문에에 appsettings.<environmentname>.json
반대로 로드하기 위해 추가 작업이 필요한지 테스트하지 않았다는 것 appsettings.json
입니다.
토큰의 가치를 얻으려면 다음을 사용하십시오.
Configuration["AppSettings:token"]
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
있습니다.
다음은 콘솔 앱에서 작동합니다.
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.Key
및 configurationSection.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);
}
}
Yuval Itzchakov의 답변을 보완하기 위해.
빌더 기능없이 구성을로드 할 수 있습니다. 삽입하면됩니다.
public IConfiguration Configuration { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
.NET Core 2.0의 경우 간단하게 다음을 수행 할 수 있습니다.
appsettings.json에서 키 / 값 쌍을 선언하십시오.
{
"MyKey": "MyValue"
}
startup.cs에 구성 서비스를 삽입하고 서비스를 사용하여 값을 얻으십시오.
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);
});
기존 답변 외에도 간결성을 위해 확장 방법 을 사용 IConfiguration
하는 것이 유용 할 수 있다고 언급하고 싶습니다 .
JWT 구성을 appsettings.json에 유지하여 확장 메소드 클래스가 다음과 같이 보입니다.
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;
}
}
그것은 많은 줄을 절약하고 깨끗하고 최소한의 코드를 작성합니다.
...
x.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
ValidAudience = _configuration.GetValidAudience(),
ValidIssuer = _configuration.GetValidIssuer()
};
IConfiguration
인스턴스를 싱글 톤 으로 등록 하고 필요할 때마다 주입 할 수도 있습니다. Autofac 컨테이너를 사용하는 방법은 다음과 같습니다.
var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();
MS Dependency Injection으로 동일한 작업을 수행 할 수 있습니다.
services.AddSingleton<IConfigurationRoot>(appConfiguration);
이것이 좋은 습관인지 의심하지만 로컬에서 작동하고 있습니다. IIS 웹 서비스에 게시 / 배포 할 때 실패하면이를 업데이트합니다.
1 단계-이 어셈블리를 클래스 상단 (내 경우에는 컨트롤러 클래스)에 추가하십시오.
using Microsoft.Extensions.Configuration;
2 단계-이것 또는 이와 유사한 것을 추가하십시오 :
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json").Build();
3 단계-이 작업을 수행하여 키 값을 호출합니다 (문자열 반환).
config["NameOfYourKey"]
그들은 단지 상황을 계속 바꾸고 있습니다-방금 VS를 업데이트하고 복구로가는 길에 전체 프로젝트 폭탄을 가지고 있었고 새로운 방식은 다음과 같습니다.
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();
}
나는이 줄을 계속 놓쳤다!
.SetBasePath(env.ContentRootPath)
다음은 ASP.NET Core의 전체 사용 사례입니다!
articles.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>
아래 코드를 시도해 볼 수 있습니다. 이것은 나를 위해 일하고 있습니다.
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;
}
}
여기에 연결 문자열과 앱 설정을 얻기 위해 하나의 클래스를 만들었습니다.
I Startup.cs 파일은 아래와 같이 클래스를 등록해야합니다.
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Settings.Configure(httpContextAccessor);
}
}
이 "속임수"입니까? 방금 Startup 클래스에서 구성을 정적으로 만든 다음 다른 곳에서 액세스 할 수 있습니다.
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; }
.NET 코어 2.1.0
- 루트 디렉토리에 .json 파일을 작성하십시오.
- 귀하의 코드에서 :
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var config = builder.Build();
3. Install the following dependencies:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json
4. Then, IMPORTANT: Right-click on the appsettings.json file -> click on Properties -> select Copy if newer:
Finally, you can do:
config["key1"]
Considering that my config file will look like this:
{ "ConnectionStrings": "myconnection string here", "key1": "value here" }
Get it inside controller as object via call Get<YourType>()
public IActionResult Index([FromServices] IConfiguration config) { BillModel model= config.GetSection("Yst.Requisites").Get<BillModel>(); return View(model); }
'Programing' 카테고리의 다른 글
안드로이드 APK의 패키지 이름을 읽으십시오 (0) | 2020.05.16 |
---|---|
Android API 21 툴바 패딩 (0) | 2020.05.16 |
반복 (0) | 2020.05.16 |
bash에 대한 별칭의 여러 명령 (0) | 2020.05.16 |
Xcode 5에서 사용할 수있는 새로운 설명서 명령은 무엇입니까? (0) | 2020.05.16 |