1. ホーム
  2. c#

[解決済み] ASP.NET Coreで.jsonファイルからAppSettingsの値を読み込む方法

2022-03-16 21:49:32

質問

AppSettingsのデータをappsettings/Config .jsonというファイルに以下のように設定しています。

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

私は.jsonファイルからAppSettingsの値を読み取る方法についてオンラインで検索しましたが、私は有用なものを得ることができませんでした。

試してみました。

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

ASP.NET4.0では、こんなことができるんですね。

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

しかし、ASP.NET Coreでこれを行うにはどうしたらいいのでしょうか?

どのように解決するのですか?

これには紆余曲折がありました。この回答を最新のものにするために修正したのは ASP.NET Core 2.0 (2018/02/26現在)をご覧ください。

これはほとんどから引用しています。 公式ドキュメント :

ASP.NETアプリケーションで設定を使用する場合は、設定のみをインスタンス化することをお勧めします。 Configuration の中で、アプリケーションの Startup クラスがあります。そして、Optionsパターンを使って、個々の設定にアクセスします。例えば 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 Core 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"));
    }
}