演示如何在程式执行中设定档(appsettings.json)实时监听

开发环境:

  1. .net 8
  2. 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;
    }
}

参考:

https://www.gss.com.tw/blog/net-core-侦测指定档案或目录变化时自动执行某些动作