如何检查MVC Core配置文件中是否存在某个部分?

时间:2017-01-12 06:05:28

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc

如何检查加载的ASP.NET Core配置文件中是否存在特定部分?

我有一个JSON配置文件,我通过Startup方法在ConfigurationBuilder.AddJsonFile类中加载它。

此JSON文件是具有以下布局的数组:

{
   "Url": "",
   "Regex": [ "", "" ],
   "Keys": {
     "Title": "",
     "Description": "",
     "Keywords": [ "" ]
   }
}

但有些人没有Keys。我尝试针对section.GetSection("Keys")检查null的返回类型,但即使null部分不存在,它也不会返回Keys

3 个答案:

答案 0 :(得分:6)

使用GetChildren方法:

var keysExists = Configuration.GetChildren().Any(x => x.Key == "Keys"));

答案 1 :(得分:2)

也可以使用Microsoft.Extensions.Configuration.Abstractions中的Exists扩展方法。 Exapmle:

var section = Configuration.GetSection("Keys")
var sectionExists = section.Exists();

public bool IsExistsConfigurationSection(string sectionKey)
{
    return Configuration.GetSection(sectionKey).Exists();
}

答案 2 :(得分:2)

我会将ConfigurationExtensions.Exists(IConfigurationSection)方法用作Алексей Сидоров suggested,因为这种方法正如the official documentation

中所述
  

确定该部分是具有值还是具有子级

不仅是孩子。

以下是我的扩展方法,其中检查部分存在,这可能对某人有帮助。

用法:

_configRoot.GetSectionChecked(nameof(Site));
// instead of 
// IConfigurationSection section = _configRoot.GetSection(nameof(Site));
// if (!section.Exists())
//     throw new ArgumentException(nameof(Site));

services.ConfigureSection<Site>(_configRoot);
// instead of 
// services.Configure<Site>("Site", _config);

services.ConfigureSection<PostsConfig>(_configRoot.GetSection(nameof(Site)), nameof(Site.Posts));
// instead of 
// services.Configure<PostsConfig>(_configRoot.GetSection(nameof(Site)).GetSection(nameof(Site.Posts)));

扩展方法:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;

public static class ConfigurationExtensions
{
    public static IConfigurationSection GetSectionChecked(this IConfiguration config, string sectionName)
    {
        var section = config.GetSection(sectionName);
        CheckSection(section);
        return section;
    }

    public static IServiceCollection ConfigureSection<TOptions>(this IServiceCollection services, IConfiguration config, string sectionName = null) 
        where TOptions : class
    {
        string typeName = sectionName ?? typeof(TOptions).Name;
        IConfigurationSection section = config.GetSectionChecked(typeName);
        return services.Configure<TOptions>(section);
    }

    public static IServiceCollection ConfigureSection<TOptions>(this IServiceCollection services, IConfigurationSection section, string sectionName = null)
        where TOptions : class
    {
        CheckSection(section);
        return services.ConfigureSection<TOptions>((IConfiguration)section, sectionName);
    }

    private static void CheckSection(IConfigurationSection section)
    {
        if (!section.Exists())
            throw new ArgumentException($"Configuration section '{section.Path}' doesn't exist.");
    }
}