微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多租户配置 IOptionsMonitor 重载

如何解决多租户配置 IOptionsMonitor 重载

我有一个使用 .NET Core 2.1 的 Windows 服务,它负责读取多个 .json 配置文件来处理它在 IIS 中监控的网站的不同配置。我正在尝试查看重新加载配置是否有效,但每次我在进行更改后查看类型配置时,我都看不到更改。

我正在注册配置文件并配置它绑定的类型选项,如下所示:

 IHostBuilder host = Host
        .CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context,builder) =>
        {
            // Site Configuration
            foreach (IISWebsite site in _siteRepository.Sites.OrderBy(x => x.Name))
            {
                builder.AddJsonFile($"{site.SiteConfigFile}",false,true);
            }
        })
        .ConfigureServices((context,serviceCollection) =>
        {
            foreach (IISWebsite site in _siteRepository.Sites.OrderBy(x => x.Name))
            {
                serviceCollection.Configure<SiteConfiguration>(site.Name,context.Configuration.GetSection("SiteConfig"));
            }
        }

我基本上是在 _siteRepository.Sites 中为每个 IIS 网站添加所有配置文件,然后尝试使用相应的文件配置每个键入的 SiteConfiguration。这是正确的做法吗?

例如

    IIS 中的
  • DefaultWebsite 将映射到 DefaultWebsite.json 配置文件
  • IIS 中的
  • SomeWebsite 将映射到 SomeWebsite.json 配置文件

在尝试测试配置时,我使用 .Get(name) method 获取我配置的特定站点名称的配置。 .Get(name) 是否像 .CurrentValue 一样提供配置的当前值?

例如。 SiteName 的值在以下示例之外填充,并在 ExecuteAsync 运行时已知。

public class Monitor : BackgroundService
{
    private readonly IOptionsMonitor<SiteConfiguration> _siteConfig;

    public Monitor(IOptionsMonitor<SiteConfiguration> config)
    {
        _siteConfig = config;
    }    

    public string SiteName { get; set; }

    public override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        string a = string.Empty; // Put a breakpoint here,inspect the value below,then change config
        string unchangedConfig = _siteConfig.Get(SiteName).ConfigValue;
        string b = string.Empty; // Put a breakpoint here,inspect the value above,no change.
    }
}

配置值没有任何变化,我不知道为什么。

我什至覆盖了 OnChange 方法并且它确实受到了攻击(不止一次,但我认为这应该发生)但我所做的更改从未存在。我还注意到 OnChange 方法的字符串参数具有不同的命名选项,即使我只更改了其中一个站点配置文件

public Monitor(IOptionsMonitor<SiteConfiguration> config)
{
    _siteConfig = config;

    _siteConfig.OnChange((configuration,s) =>
    {
        Console.WriteLine($"{s} website's config changed"); // This will have s with all the different register named options.
    });
{  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。