再起動を伴わないNET5の設定変更は自動的に反映される
.NET Core、.NET5のデフォルト構成は一度だけロードされ、構成を修正する場合、再起動しないと有効になりませんが、どうすれば瞬時に修正できるのか、そのデモを紹介します。
I. 設定ファイルをリアルタイムに反映させる設定
1.1 構成
Program.cs の CreateHostBuilder() で設定ファイルを読み込む際に reloadOnChange:true を追加する。
こうすることで、設定ファイルが変更されたとき、プログラムはファイルへの変更をリッスンし、自動的に再読み込みします。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
1.2 バリデーション
appsettings.json ファイルの内容は次のとおりです。
{
"TestSetting": "123",
"AppOptions": {
"UserName": "zhangsan"
}
}
コード
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _configuration;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public IActionResult Index()
{
string Name = _configuration["TestSetting"];
string Name2 = _configuration["AppOptions:UserName"];
ViewBag.Name = Name;
ViewBag.Name2 = Name2;
return View();
}
}
インターフェイスが表示されます。
設定ファイルを次のように変更します。
{
"TestSetting": "abc",
"AppOptions": {
"UserName": "zhangsan123"
}
}
ページが変更されたので、更新する。
1.3 IOptionsのアプローチはリアルタイムで効果を発揮する
AppOptions.cs クラスを新規に作成します。
/// <summary>
//// Configuration file
/// </summary>
public class AppOptions
{
public string UserName { get; set; }
}
Startup.csのOptionsに設定を追加します。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
}
使用すること。
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _configuration;
private AppOptions _options;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
{
_logger = logger;
_configuration = configuration;
_options = appOptions.CurrentValue;
}
public IActionResult Index()
{
string Name = _configuration["TestSetting"];
string Name2 = _options.UserName;
ViewBag.Name = Name;
ViewBag.Name2 = Name2;
return View();
}
}
IOptionsには3つの方法があります。
//IOptions<T> //The value obtained after the site is started is always the same
//IOptionsMonitor<T> //If the configuration file changes after the site is started, an event will be posted (reloadOnChange:true must be true when loading the configuration)
//IOptionsSnapshot<T> //After the site is started, each time the value obtained is the latest value in the configuration file (reloadOnChange:true must be true when loading the configuration)
注意事項
AddSingleton Services で IOptionsMonitor<T> を使用しても、設定をすぐに有効にすることはできず、IOptionsSnapshot<T> は起動時にエラーを報告するようになりました。
例
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private UserService _userService;
public HomeController(ILogger<HomeController> logger, UserService userService)
{
_userService = userService;
}
public IActionResult Index()
{
string Name2 = _userService.GetName();
ViewBag.Name2 = Name2;
return View();
}
}
public class UserService
{
private AppOptions _options;
public UserService(IOptionsMonitor<AppOptions> appOptions)
{
_options = appOptions.CurrentValue;
}
public string GetName()
{
var Name = _options.UserName;
return Name;
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
services.AddSingleton<UserService>();
}
上記のUserServiceはシングルインスタンスで注入されており、1.2では_configuration["AppOptions:UserName"]によってのみ取得できるIOptionsによって設定がリアルタイムにリフレッシュされるわけではありません。
そのため、これらのメソッドは、シナリオによって使い分ける必要があります。
1.4 複数プロファイルの読み込みがリアルタイムで有効になる
dbプロファイルを追加する
Program.cs の CreateHostBuilder() を修正し、読み込み時に reloadOnChange:true を追加すれば完了です。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
config.AddJsonFile("Configs/dbsetting.json", optional: true, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
を使用する。
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _configuration;
private AppOptions _options;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
{
_logger = logger;
_configuration = configuration;
_options = appOptions.CurrentValue;
}
public IActionResult Index()
{
string Name = _configuration["TestSetting"];
string Name2 = _configuration["db:connection1"];
ViewBag.Name = Name;
ViewBag.Name2 = Name2;
return View();
}
}
.NET5 自動的に再起動しない設定変更についてはこちらをご覧ください。
関連
-
.netcoreプロジェクトでIStartupFilterを使用するためのチュートリアル
-
pythonでpillowをインストールする3つの方法
-
.NET 6:.NETのロギングコンポーネントlog4netを使用する。
-
NETガベージコレクション GC診断ツール dotnet-gcmon 使用方法
-
ASP.NET CoreでURLを設定する5つの方法
-
30分でわかるコング経由の.NETゲートウェイ
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
swagger uiをasp.net coreに統合する原理
-
認証プロセスの記録にjwtを使用したネット
-
非同期タスクキャンセルと監視のネット実装
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NET 6の新しい設定オブジェクトConfigurationManagerの紹介
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
ネットのメモリ管理に関する5つの基本
-
.NET開発サーバー アプリケーション管理ツール
-
ASP.NET Coreミドルウェアによるグローバル例外処理機構の利用について
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
ASP.NET Core MVC フィルタ
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
-
CS0234 名前空間 'Microsoft.AspNet' に型または名前空間名 'Mvc' が存在しない (あなたは