如何检查加载的ASP.NET Core配置文件中是否存在特定部分?
我有一个JSON配置文件,我通过Startup
方法在ConfigurationBuilder.AddJsonFile
类中加载它。
此JSON文件是具有以下布局的数组:
{
"Url": "",
"Regex": [ "", "" ],
"Keys": {
"Title": "",
"Description": "",
"Keywords": [ "" ]
}
}
但有些人没有Keys
。我尝试针对section.GetSection("Keys")
检查null
的返回类型,但即使null
部分不存在,它也不会返回Keys
。
答案 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.");
}
}