.Net Core出来好久了,一直在了解,但始终没有应用到实际项目中....
准备用.net core搞个SSO,才发现它和.net framework的变化并不是一点点...
.net core还在学习摸索中,这篇文章就遇到的问题记录一下,希望对需要的人有所帮助
环境变量.Net Core包含一个launchSettings.json的文件,在项目的Properties"文件夹下
本地计算机开发环境中,这个文件设置了.net core不同运行环境中每个变量的值
在生产环境中,设置环境的方法取决于操作系统而不是此文件了
我们可以通过配置环境变量启用或禁用应用程序部分功能
在Startup.cs 的 Configure函数中可通过IHostingEnvironment来获取当前环境变量的配置
配置项读写WebHost.CreateDefaultBuilder(args) 这段代码会加载默认配置项,同时也可能启用部分服务
加载顺序为:
appsettings.json。
appsettings.{Environment}.json。
应用在 Development 环境中运行时的用户机密。(secrets.json)
环境变量。(launchSettings.json)
命令行参数。
读取配置项以下面的appsettings设置为例:
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } }, "App": { "ConnectionStrings": { "RwViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;", "RoViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;" }, "AppSettings": { "SqlHelperNonQueryCommandTimeout": 30, "SqlHelperQueryCommandTimeout": 30 } } }读取单个节点: Configuration.GetSection("App:ConnectionStrings:RwViewSQLConnString")
将节点绑定到实体数据模型:Configuration.GetSection("App").Bind(new ConfigOptions());
在类库中获取IConfiguration:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); ApplicationEnvironment env = PlatformServices.Default.Application; IConfiguration Configuration = builder.Build();也可以用ioc的注入从构造函数中获取,不过着实不方便,更建议建一个静态类来保存全局配置
可以监听配置文件的改变事件来重新绑定实体模型:
Configuration.GetReloadToken().RegisterChangeCallback(OnSettingChanged, Configuration); public void OnSettingChanged(object state) { callbackRegistration?.Dispose(); IConfiguration configuration = (IConfiguration)state; configuration.GetSection("App").Bind(new ConfigOptions()); callbackRegistration = configuration.GetReloadToken() .RegisterChangeCallback(OnSettingChanged, state); } 按环境配置我们可以通过设置 launchSettings.json文件中对应启动方式的ASPNETCORE_ENVIRONMENT值来设定程序的运行环境,官方只支持三个固定的值:Development、Staging 或 Production
appsettings.json会优先读取appsettings.{Environment}.json中设定的值
用户机密按照我们以往的习惯,可能习惯于将之前存在web.config中的配置项转移到 appsettings.json 中存储,但是对于数据库连接字符串等加密信息如今.net core不太建议我们通过这种方式来存储
在开发环境中它提供了另一种存储方式:机密管理器
实际上是将密码的配置存储到本地电脑的一个json文件当中,这个文件存储的位置与操作系统和服务器的登陆用户有关。
这种做法的好处总结为下两点:
将机密文件与项目源代码分离,提高安全性
以连接字符串为例,如果多人开发的情况,每个人可能用到的链接不同,避免的多人都在更改同一个配置文件,上传时还要还原的繁琐
下面介绍下机密管理器的使用方式:
安装nuget包:
Microsoft.Extensions.Configuration.UserSecrets
Microsoft.VisualStudio.Web.CodeGeneration.Tools
第一个包用于配置机密文件 第二个用于读取配置
此时查看项目的工程文件(*.csproj),可以看到多出来一个UserSecretsId节点的配置,类似于下面这样:
<UserSecretsId>79bbf988-8542-4789-a63e-d4a3588c64a3</UserSecretsId>在vs中我们可以右键项目->Manage User Secrets 编辑机密文件:
{ "App": { "ConnectionStrings": { "RwViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;", "RoViewSQLConnString": "server=*;Initial Catalog=*;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=300;" }, "AppSettings": { "SqlHelperNonQueryCommandTimeout": 40, "SqlHelperQueryCommandTimeout": 40 } } }我们再一次读取 configuration.GetSection("App").Bind(new ConfigOptions()); 中的配置项就会以 User Secrets中的配置为准