appsettings.json の動作を確認する
環境
- Visual Studio
-
- Visual Studio 2019
- ASP.NET Core
-
- 3.0
- 3.1
はじめに
新規で ASP.NET Core プロジェクトを作成すると appsettings.json と appsettings.Development.json の設定ファイルが プロジェクトに含まれています。
ここで設定される内容は、appsettings.json に設定されているパラメータが使用されますが、 開発時においては同一キーのパラメータは appsettings.Development.json の設定で上書きされたものが使用されます。
これらがどのように切り替えられて読み込まれるかをこの記事で確認したいと思います。
動作の確認のための編集
試しにその動作を確認するためにそれぞれの設定ファイルにパラメータを追加してみます。 それぞれに TestObject セクションを追加し、TestValue パラメータを追加します。
appsettings.json ファイルは Shift-JIS の文字コードで作成されているので、日本語を入れる場合は UTF-8 で保存しなおしてください。
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"TestObject": {
"TestValue": "Root です。",
"Comment": "日本語を使用する場合は appsettings.json を UTF-8 で保存しなおすこと。"
}
}
appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"TestObject": {
"TestValue": "Development です。",
"Comment": "日本語を使用する場合は appsettings.json を UTF-8 で保存しなおすこと。"
}
}
HomeController.cs の Index アクションで設定ファイルのパラメータを取得します。 クラスを指定して取得する方法もありますが、今回の主題ではないので割愛します。
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _configuration;
// DI で IConfiguration を受け取る
public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public IActionResult Index()
{
// appsettings.json から値を取得します。
// 階層化されている場合は GetSection を使用します。
ViewData["Message"] = _configuration.GetSection("TestObject").GetValue<string>("TestValue");
return View();
}
クラスを作成してバインドして読み込む場合は以下のようなコードになります。
// クラス定義 public class TestObject { public string TestValue { get; set; } public string Comment { get; set; } } // 読み込み var testObject = _configuration.GetSection(nameof(TestObject)).Get<TestObject>();
ビュー側の Index.cshtml で取得した値を表示します。
<p>appsettings.json から取得したテキストを表示</p>
<p>@ViewData["Message"]</p>
ローカルでデバッグ実行
プロジェクトをビルドしデバッグ実行してみると appsettings.Development.json の設定が表示されていることが分かります。
Development 側が選択されている理由としては ASP.NET Core のアプリを実行する際に環境変数が読み込まれるのですが、 そのパラメータとして ASPNETCORE_ENVIRONMENT に設定されるパラメータが appsettings.XXXX.json の XXXX の部分に一致する設定ファイルが読み込まれるようになっています。
デバッグ時には Develop が設定されるようになっており、これはプロジェクトのプロパティのデバッグ タブ、 環境変数で設定されていることが確認できます。
試しにこの値を別な値に変更してデバッグ実行すると、 Development 側が読み込まれずルート側が読み込まれることが確認できると思います。
ちなみにこのパラメータは Debug や Release で切り分けられていないため、Release でデバッグ実行しても Development のパラメータが使用されます。 web.config の時のように Debug や Release で分けることはできませんが、プロファイルが複数登録できるので、 そちらの切り替えでリリース時の設定を確認するなどの対応を行うことができます。
IIS に配置して実行
では、IIS に配置して実行した場合はどうなるのでしょうか。 実際に IIS にサイトを作成してプログラムを配置してみます。
こちらは想定される通りルートの設定が使用されます。ですので IIS にプログラムを配置する場合は Develop の設定を気にする必要はありません。
一応 IIS 側で ASPNETCORE_ENVIRONMENT 環境変数に任意の値を仕込んでおけば実行時にその設定ファイルを読み込むことはできます。 サイトの設定から構成エディターを開きます。
セクションから system.webServer の中の aspNetCore を選択します。
場所から ApplicationHost.config を選択します。
environmentVariables のコレクションを開きます。
コレクションを追加します。
name に ASPNETCORE_ENVIRONMENT を入力し、value に読み込みたい設定ファイルの名前を入力します。
サイトを再起動して Web 画面を表示すれば対象の設定ファイルを読み込んでいるのが確認できると思います。
まとめ
初期構成であれば、開発時は appsettings.Development.json の設定が読み込まれ、IIS などの本番環境に配置された場合は appsettings.json が読み込まれると思って問題ないと思います。
プロジェクト作成時は Development しかありませんが、appsettings は複数作成することもでき、Development の部分は任意の名前に変えることもできます。 複数の実行場所がある場合などは複数作成しておき、環境に合わせて ASPNETCORE_ENVIRONMENT を設定して運用することになります。