博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core中的配置
阅读量:5985 次
发布时间:2019-06-20

本文共 11359 字,大约阅读时间需要 37 分钟。

配置

配置来源

  • 命令行参数
  • 自定义提供程序
  • 目录文件
  • 环境变量
  • 内存中的.NET 对象
  • 文件

    默认配置

  • CreateDefaultBuilder方法提供有默认配置,在这个方法中会接收前缀为ASPNETCORE_的变量和命令行参数以及appsettings.json和appsettings.{Environment}.json等,可以通过下面的源码看到,注意配置文件的顺序
  • 一般顺序为
  1. 文件
  2. Azure
  3. 用户机密(生产中没有)
  4. 环境变量
  5. 命令行参数

命令行参数可以更新替换相关的程序设置,与前面提到的顺序有关,详细见下面的约定

public static IWebHostBuilder CreateDefaultBuilder(string[] args)        {            var builder = new WebHostBuilder();            if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))            {                builder.UseContentRoot(Directory.GetCurrentDirectory());            }            if (args != null)            {                builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());            }            builder.UseKestrel((builderContext, options) =>                {                    options.Configure(builderContext.Configuration.GetSection("Kestrel"));                })                .ConfigureAppConfiguration((hostingContext, config) =>                {                    var env = hostingContext.HostingEnvironment;                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)                          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);                    if (env.IsDevelopment())                    {                        var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));                        if (appAssembly != null)                        {                            config.AddUserSecrets(appAssembly, optional: true);                        }                    }                    config.AddEnvironmentVariables();                    if (args != null)                    {                        config.AddCommandLine(args);                    }                })                .ConfigureLogging((hostingContext, logging) =>                {                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));                    logging.AddConsole();                    logging.AddDebug();                    logging.AddEventSourceLogger();                })                .ConfigureServices((hostingContext, services) =>                {                    // Fallback                    services.PostConfigure
(options => { if (options.AllowedHosts == null || options.AllowedHosts.Count == 0) { // "AllowedHosts": "localhost;127.0.0.1;[::1]" var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); // Fall back to "*" to disable. options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" }); } }); // Change notification services.AddSingleton
>( new ConfigurationChangeTokenSource
(hostingContext.Configuration)); services.AddTransient
(); }) .UseIIS() .UseIISIntegration() .UseDefaultServiceProvider((context, options) => { options.ValidateScopes = context.HostingEnvironment.IsDevelopment(); }); return builder; }

相关约定

  • 键不区分大小写,但是linux好像区分,所以最好还是有区分的好
  • 同键值会被覆盖,以最后的为准
  • 环境变量中,冒号分隔不适应用所有的平台,但是双下划线支持所有的平台
  • Azure中用两个破折号,国内有阿里的比较多
  • ConfigurationBinder支持配置到对象的转换,有Bind和Get<>的两种方式,注意区分,建议用Get
  • 值是字符串且NULL不能出现在配置文件中也不能绑定到相应的对象中去

    参数提供程序

    主机通过ConfigureAppConfiguration指定应用配置程序

    命令行参数提供程序

    配置
  • 其实CreateDefaultBuider已经支持了,但是如果需要应用程序配置并能实现覆盖的功能就需要在CnfigureAppConfiguration中添加并且在最后添加AddCommandLine如下:
//一种写法public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>        WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                // Call other providers here and call AddCommandLine last.                config.AddCommandLine(args);            })            .UseStartup
();//另一种写法var config = new ConfigurationBuilder() // Call additional providers here as needed. // Call AddCommandLine last to allow arguments to override other configuration. .AddCommandLine(args) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();
使用
  • 命令行后有两种赋值方式,等号和空格(键前必顺有--或/),不要混合使用(知道的多不是让你乱用的,你的明白)
  • 等号赋值 值可以为null
dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2dotnet run CommandLineKey1= CommandLineKey2=value2
  • 交换映射
    就是给命令行的键值改名,以-开头的必顺要交换,再加上默认提供程序没有注入的地方,如果硬传将造成格式异常,所以可以通过AddCommandLine在ConfigureAppConfiguration中进行传递
public static readonly Dictionary
_switchMappings = new Dictionary
{ { "-CLKey1", "CommandLineKey1" }, { "-CLKey2", "CommandLineKey2" } }; WebHost.CreateDefaultBuilder() .ConfigureAppConfiguration((hostingContext, config) => { config.AddCommandLine(args, _switchMappings); }) .UseStartup
();

环境变量提供程序

注意:分隔无法适应所有的平台,__可以,由加载顺序可以知道环境变量是可以替换appsettings文件中的配置,注意默认的环境变量前缀是ASPNETCORE_所以为了区分自己添加的不要用这个前缀了,前缀尽量见名知义,一个结果 就是能自解

配置

与命令行一样在ConfigureAppConfiguration中添加并声明前缀,如下:

WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                // Call additional providers here as needed.                // Call AddEnvironmentVariables last if you need to allow environment                // variables to override values from other providers.                config.AddEnvironmentVariables(prefix: "PREFIX_");            })            .UseStartup
();//二种写法var config = new ConfigurationBuilder() .AddEnvironmentVariables() .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();
使用

就是配置系统级的环境变量,不同的系统不太一样,windows可以在属性->环境变境中找到,linux可以命令行配置也可以直接改文件

文件配置提供程序(重点,重点,使用比较多)

首先明白不论何种文件,一定要能根据路径找到,所以我们一定要通过SetBasePath设置基路径,然后再是不同的文件

INI文件

配置

与前面的一样也是在ConfigureAppConfiguration中添加

WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                config.SetBasePath(Directory.GetCurrentDirectory());                config.AddIniFile("config.ini", optional: true, reloadOnChange: true);            })            .UseStartup
();//二种var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddIniFile("config.ini", optional: true, reloadOnChange: true) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();

JSON文件

配置
WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                config.SetBasePath(Directory.GetCurrentDirectory());                config.AddJsonFile("config.json", optional: true, reloadOnChange: true);            })            .UseStartup
();//二种var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("config.json", optional: true, reloadOnChange: true) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();

XML文件

配置
WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                config.SetBasePath(Directory.GetCurrentDirectory());                config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);            })            .UseStartup
();//另一种写法(二种)var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddXmlFile("config.xml", optional: true, reloadOnChange: true) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();

Key-pre-file配置提供程序

使用目录的文件作为配置,键是文件名,值是包含在文件的内容。路径必顺是绝对路径。双下划线字符 (__) 用作文件名中的配置键分隔符。 例如,文件名 Logging__LogLevel__System 生成配置键 Logging:LogLevel:System

配置
WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration((hostingContext, config) =>            {                config.SetBasePath(Directory.GetCurrentDirectory());                var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");                config.AddKeyPerFile(directoryPath: path, optional: true);            })            .UseStartup
();//二种var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");var config = new ConfigurationBuilder() .AddKeyPerFile(directoryPath: path, optional: true) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();

内存配置提供程序

就是内存中的对象(字典对象之流)结构为IEnumerable<KeyValuePair<String,String>>

配置
public static readonly Dictionary
_dict = new Dictionary
{ {"MemoryCollectionKey1", "value1"}, {"MemoryCollectionKey2", "value2"} };WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddInMemoryCollection(_dict); }) .UseStartup
();//二种var dict = new Dictionary
{ {"MemoryCollectionKey1", "value1"}, {"MemoryCollectionKey2", "value2"} };var config = new ConfigurationBuilder() .AddInMemoryCollection(dict) .Build();var host = new WebHostBuilder() .UseConfiguration(config) .UseKestrel() .UseStartup
();

获取配置内容

  • GetSection 获取指定子节键提取值
  • GetChildren 获取节点的值
  • Bind 把字符串构造为POCO对象
  • Get 绑定并返回指定类型 Get 比使用 Bind 更方便

绑定是按约定提供的。 不需要自定义配置提供程序实现数组绑定。

可以在代码中读到相应的值

var configEntryFilter = new string[] { "ASPNETCORE_", "urls", "Logging", "ENVIRONMENT", "contentRoot", "AllowedHosts", "applicationName", "CommandLine" };            var config = cfg.AsEnumerable();            FilteredConfiguration = config.Where(               kvp => config.Any(                   i => configEntryFilter.Any(prefix => kvp.Key.StartsWith(prefix))));            var starship = new Starship();            cfg.GetSection("starship").Bind(starship);            Starship = starship;            TvShow = cfg.GetSection("tvshow").Get
(); ArrayExample = cfg.GetSection("array").Get
(); JsonArrayExample = cfg.GetSection("json_array").Get
(); Customer customer = cfg.GetSection("customer").Get
(); var value1 = cfg.GetValue
("name", "read error");

自定义配置提供程序

该示例应用演示了如何使用实体框架 (EF) 创建从数据库读取配置键值对的基本配置提供程序。

倒着分析(正分析看官文)

  • 我们要添加一个配置到ConfigurationBuilder中(可以用扩展 AddEFConfiguration)
  • 要扩展我们要有配置内容类来作为载体EFConfigurationContext
  • 我们要用对应的内容解析类来提供解析 EFConfigurationProvider
  • 最后我们要有解析出来对应的对象来进行绑定 EFConfigurationValue

-最后我们要注入到ConfigureServices和Configure中这样就可以在指定的作用域内使用了

详见我抄官网上的,同样官网上的源码也是可以运行的。

转载于:https://www.cnblogs.com/ants_double/p/10511863.html

你可能感兴趣的文章
dplyr 数据操作 列操作(select / mutate)
查看>>
回文数字
查看>>
因特网中和多媒体有关的协议
查看>>
哈希表
查看>>
Tell Me About Yourself - Best Answers and Examples
查看>>
吴志攀常务副校长在学院2011年春季毕业典礼上的讲话
查看>>
UVa 10618 Tango Tango Insurrection
查看>>
购物车
查看>>
正则表达式 捕获分组
查看>>
20165302 预备作业3 Linux安装及学习
查看>>
关联查询,将主表中多个字段中的值 与 字典表 进行映射替换。
查看>>
本地JAR包打入本地mvn仓库
查看>>
移动端网页布局中需要注意事项以及解决方法总结
查看>>
Delegate in Cocoa
查看>>
JQuery操作input
查看>>
软件测试——白盒测试
查看>>
threading多线程模块
查看>>
Android开发,Eclipse创建aidl接口时,出错
查看>>
头文件里面的ifndef /define/endif的作用
查看>>
二路归并排序算法实现-完整C语言程序
查看>>