Web.config配置
-
以往在做 .Net项目的时候,一般都是以项目默认的web.config文件作为默认的配置文件来进行相关参数的配置,但是它也存在一些缺点,比如只能读取本地文件、安全风险、不利于管理等缺点,
-
.NET 中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖
Json文件配置
- 项目目录下创建appsettings.json文件,记得属性设置为“较新则复制”。
- NuGet安装Microsoft.Extension.Configuration和Microsoft.Extension.Configuration.Json两个包。
- 以下是实现代码appsettings.json文件内容如下:
static void Main(string[] args)
{
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
IConfigurationRoot configurationRoot = configurationBuilder.Build();
string name = configurationRoot["name"];
Console.WriteLine($"name:{name}");
string address = configurationRoot.GetSection("proxy:address").Value;
Console.WriteLine($"address:{address}");
}
注意:
- AddJsonFile方法的第二个参数,optional ,如果设置成false,则在编译的时候没找到指定文件的话,就会报错,如果设置成true,那么编译不会报错,程序执行若没找到文件就会报错;第三个参数reloadOnchange,是指是否再文件发生变化的时候重新加载;
- 如果参数不是在最外层的,比如上面的proxy里面的address配置,就需要GetSection方法,如果是在完成的,那就就可以直接用configuration[key]方法;
- Json文件里面所有的配置项都是字符串类型的
运行结果如下:
选项方式读取。配合DI
1、推荐使用选项方式读取,和DI结合更好,且更好利用 :“reloadonchange”机制。
2、NuGet安装:Microsoft.Extensions.Options.当然也需要
Microsoft.Extensions.Configuration.Binder,
Microsoft,Extensions.Configuration
Microsoft,Extensions.Configuration.Json .
3、读取配置的时候,DI要声明IOptions<T>l0ptionsMonitor<T>、l0ptionsSnapshot<T>等类型:I0ptions<T>不会读取到新的值;和I0ptionsMonitor相比,l0ptionsMonitor会在同一个范围内(比如ASP.NET Core-个请求中)保持一致。建议用I0ptionsSnapshot。
第一步,创建配置信息类
public class AppSettings
{
public string name { get; set; }
public int age { get; set; }
public Proxy proxy { get; set; }
}
public class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
第二步,定义controller类,并在该类中实现对配置的DI注入,注意,这里用的方式不是简单的类注入,而是使用IOptionsSnapshot<T>类型,可以实现对配置信息的实时获取:
public class TestController
{
private readonly IOptionsSnapshot<AppSettings> _optionsSnapshot ;
public TestController(IOptionsSnapshot<AppSettings> optionsSnapshot)
{
_optionsSnapshot = optionsSnapshot;
}
public void TestGetValue()
{
Console.WriteLine(_optionsSnapshot.Value.name);
Console.WriteLine("*************************");
Console.WriteLine(_optionsSnapshot.Value.age);
Console.WriteLine("*************************");
Console.WriteLine(_optionsSnapshot.Value.proxy.address);
Console.WriteLine("*************************");
Console.WriteLine(_optionsSnapshot.Value.proxy.port);
}
}
第三步:通过DI获取TestController实例,并且获取配置信息
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<TestController>();
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
IConfigurationRoot configurationRoot = configurationBuilder.Build();
//Config配置注入
services.AddOptions().Configure<AppSettings>(e => configurationRoot.Bind(e)).
Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));
using (ServiceProvider sp = services.BuildServiceProvider())
{
TestController controller = sp.GetRequiredService<TestController>();
controller.TestGetValue();
Console.WriteLine("--------------------------------------------");
}
}
运行结果如下:
- 此时,如果我们去修改debug目录下的appsettings.json 的内容是,程序获取的配置信息并不会发生改变,因为TestController是在同一个范围内Scope使用的,如果我们不在一个范围内去获取,则每次修改之后,会实时反映到获取的值中:如下:
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<TestController>();
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
IConfigurationRoot configurationRoot = configurationBuilder.Build();
//Config配置注入
services.AddOptions().Configure<AppSettings>(e => configurationRoot.Bind(e)).
Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));
using (ServiceProvider sp = services.BuildServiceProvider())
{
while (true)
{
using (var scope = sp.CreateScope())
{
TestController controller = scope.ServiceProvider.GetRequiredService<TestController>();
controller.TestGetValue();
Console.WriteLine("--------------------------------------------");
}
Console.ReadKey();
}
}
}
我们修改一下年龄值:从46岁改成86岁
通过控制台获取的结果可以看到,获取到的配置信息也实时改变了:
-
命令行参数
通过传递命令行数据作为参数,ConfigBuilder.AddCommandLine(args);
当然,我们可以不在命令行参数,而是在项目->属性->调试界面,直接增加参数,如下
运行后同样可以获取参数:
-
读取环境变量的配置:
与命令行参数配置类似,.net core还提供读取项目环境变量的功能,也是在项目的属性的调试菜单下配置:
运行结果如下
- 读取环境变量的方法还支持增加一个前缀的功能,比如项目环境变量名称和电脑环境变量冲突的话,那么就可以在项目的参数名称加上自定义的前缀,便于区分;
如下,我在每个环境变量节点名前面加了一个"a_"的前缀,
那么在获取的时候,就可以将这个前缀作为参数,来获取项目的环境变量值:
运行结果如下: