ASP.NET Core配置文件的获取和设置
在ASP.NET Core 中,应用程序配置数据可以使用JSON, XML 和 INI格式 和内置环境变量,命令行参数或内存中的集合。
1.如何获取和设置配置
ASP.NET Core配置系统针对以前的依赖于System.Configuration和XML配置文件(如Web.config)的ASP,NET 版本进行了重构。新的配置模型提供了精简高效的,能够通过检索多样化提供程序来获取基于键/值对配置的能力。应用程序和框架可以通过新的选择模式访问配置。
可以在ASP.NET Core应用程序中的Startup类中只实例化一个Configuration示例,然后选择模式来访问各自的设置。
Configuration类是一个提供读写键/值对能力的Providers集合。如果一个键值对写入Configuration,它不会持久,当源再次读写值时将会丢失。因此至少需要配置一个数据源,使得configuration能正常工作。
下面通过内存配置演示Configuration处理键值对:
内存配置一般用在一次请求中需要暂存数据的情况,例如,如果管道中有多个中间件,可以在某一个中间件中暂存数据,后面的某一个中使用。
在开发中一般会把配置值放在一个有层次的数据结构中,例如appsettings.json,在这种情况下,可以使用以: 符号分割(从层次结构的根开始)的键读取值:
{ "ConnectionStrings": { "DefaultConnection": "Data Source=.;Initial Catalog=AccessManagement;Integrated Security=True" }, "Logging": { "LogLevel": { "Default": "Information" } }, "AllowedHosts": "*", "MyOptions": { "Option1": "ww", "Option2": 3 } }
在应用程序中通过Configuration获取配置的连接字符串,可以通过ConnectionStrings:DefaultConnection读取ConnectionStrings的设置,也可以通过GetConnectionString扩展方法加参数"DefaultConnection"来获取。
应用程序所需要的设置和指定配置的机制都可以通过使用选择模式解耦。创建自己的配置类时,可以是几个不同的类,分别对应不同的配置组,然后通过选项服务注入到应用程序中。这样就可以通过配置或其他所选择的机制来设置了。
2.使用内置数据源
开发时并不局限于必须使用单个配置提供程序,可以把多个配置提供程序组合在一起。
扩展方法支持为配置添加额外的配置文件提供程序。这些方法能被独立的或链式调用在ConfigurationBuilder实例之上:
public Startup() { var builder = new ConfigurationBuilder(); builder.SetBasePath(Directory.GetCurrentDirectory()); builder.AddJsonFile("appsettings.json"); var config = builder.Build(); var _config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); }
指定配置提供程序的顺序很重要,这将影响他们的设置被应用的优先级:
public Startup(IConfiguration configuration,IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(“appsettings.json",optional:true,reloadOnChange:true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true); //配置环境变量 builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfiguration Configuration { get; }
IHostingEnvironment 服务用于获取当前环境。在Development环境中,AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true)将会查找appsettings.Development.json配置文件,并覆盖appsettings.json中存在的值。同样环境变量也会覆盖它们两个的值。
一旦将指定文件作为配置源,就可以选择当文件发生变化后,是否重新再付这部分的配置,reloadOnChange:true。
3.使用选项和配置对象
选择模式可使用自定义的配置类表示一组相关设置。这个配置类需要为配置项提供公开的 属性和一个无参的构造函数。可以根据应用程序的功能分解为多个配置对象。
下面自定义appsettings.json的配置类,并使用:
先创建配置类
namespace MVCTest { public class AppSettingOptions { public DefaultConnec ConnectionStrings { get; set; } public string AllowedHosts { get; set; } } public class DefaultConnec { public string DefaultConnection { get; set; } } }
在ConfigureServices中调用选项服务:
public Startup(IConfiguration configuration,IHostingEnvironment env) { //Configuration = configuration; var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json",optional:true,reloadOnChange:true) //.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true); //配置环境变量 builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddOptions();//提供依赖注入 services.Configure<AppSettingOptions>(Configuration); //绑定配置选项 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
在HomeController中使用:
public class HomeController : Controller { private readonly IOptions<AppSettingOptions> _options; public HomeController(IOptions<AppSettingOptions> options,) { _options = options; } public static Logger nlog = LogManager.GetCurrentClassLogger(); public IActionResult Index() { var AllowedHosts = _options.Value.AllowedHosts; var DefaultConnection = _options.Value.ConnectionStrings.DefaultConnection; } }
结果:
当通过绑定选项来配置选项类型的每一个属性时,实际上是绑定到每一个配置键。配置键是大小写不敏感的。
当通过调用services.Configure<AppSettingOptions>(Configuration);代码,将一个IConfigureOptions<AppSettingOptions>服务加入服务容器,是为了后面应用程序或框架能通过IOptions<AppSettingOptions>服务来获取配置。若想从其他途径(从数据库通过EF获取)获取配置,可以使用ConfigureOptions<TOptions>扩展方法直接指定经过定制的IConfigureOptions<TOptions>服务。
其他方法:
//通过代码编写 services.Configure<AppSettingOptions>(options=> { options.AllowedHosts = "test"; }); //只配置部分 services.Configure<AppSettingOptions>(Configuration.GetSection("ConnectionStrings"));