演示如何在程式執行中設定檔(appsettings.json)實時監聽
開發環境:
- .net 8
- install NuGet
Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json
.
// 監視設定檔的變更並記錄到日誌文件中
using Microsoft.Extensions.Configuration;
// 用於監視設定檔的變更
using Microsoft.Extensions.Primitives;
// 用於讀取設定檔
using System.Text.Json.Nodes;
class Program
{
// 舊的設定檔
static JsonNode? oldConfigurationJson;
// 設定檔根物件
static IConfigurationRoot? configuration;
static void Main(string[] args)
{
// 建立設定檔建構器
var configurationBuilder = new ConfigurationBuilder();
// 加入設定檔 reloadOnChange: true => 當 appsettings.json 被修改時,會自動重新載入
configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
// 建立設定檔根物件
configuration = configurationBuilder.Build();
// 儲存初始設定
oldConfigurationJson = JsonNode.Parse(File.ReadAllText("appsettings.json"));
// 設定回呼函式以處理檔案變更
ChangeToken.OnChange(
// 監視設定檔
() => configuration.GetReloadToken(),
// 當設定檔變更時的處理方法
() => OnConfigurationChanged()
);
Console.WriteLine("監視 'appsettings.json' 的變更。按 Enter 鍵結束程序。");
Console.ReadLine();
}
/// <summary>
/// 偵測到 'appsettings.json' 的變更時的處理方法。
/// </summary>
private static void OnConfigurationChanged()
{
Console.WriteLine("偵測到 'appsettings.json' 的變更!");
var newConfigurationJson = JsonNode.Parse(File.ReadAllText("appsettings.json"));
// 比較舊設定和新設定
var differences = CompareJson(oldConfigurationJson, newConfigurationJson);
// 記錄到日誌文件中
File.AppendAllText("config-changes.log", $"{DateTime.Now}: {differences}\n");
// 更新舊設定
oldConfigurationJson = newConfigurationJson;
}
/// <summary>
/// 比較兩個 JSON 物件並返回差異。
/// </summary>
/// <param name="oldJson">舊的 JSON 物件。</param>
/// <param name="newJson">新的 JSON 物件。</param>
/// <returns>差異的字串,如果沒有差異則返回 "無變更"。</returns>
private static string CompareJson(JsonNode oldJson, JsonNode newJson)
{
var differences = "";
foreach (var property in oldJson.AsObject())
{
var propertyName = property.Key;
var oldValue = property.Value;
var newValue = newJson[propertyName];
if (newValue == null || !newValue.Equals(oldValue))
{
differences += $"{propertyName}: old='{oldValue}', new='{newValue}'; \n";
}
}
return string.IsNullOrEmpty(differences) ? "無變更" : differences;
}
}
參考: