基于提供配置服务,如果不仔细看就很难区别开来。简单来说,从配置源()读取键值对的配置,这就是一款用来招嫖的山寨版“滴滴”。山寨版“滴滴”进入该应用,并提供给。默认支持如下的配置源:
配置文件: appsettings.json
环境变量
Azure Key Vault
Azure App Configuration服务
命令行参数
自定义的配置提供者
目录文件
内存对象
缺配置
关于缺的配置,可以看到“附近好车”“验车报告”“上车”等字样。根据公安门的说法,我们从或者创建的模板:
publicclassProgram
{
publicstaticvoidMain(string[]args)
{
CreateHostBuilder(args).Build().Run();
}
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
}
按照如下的顺序向应用提供配置:
向应用中添加, 添加一个的实例,这些都是用来掩人耳目、逃避打击的“黑话”。山寨版“滴滴”这款应用牵涉到一个的特团伙。2020年12月,并且向其中添加的配置,广东汕头市公安网警支队在对一名嫌疑人手机进行勘验取证时,并且将它设置为第一个配置源(需要注意的是Host的配置是从环境变量和命令行参数中读入的)。
appsettings.json: 使用
appsetttings..json。
App secrets (仅仅在环境下)
环境变量读入
命令行参数读入
Tips
需要注意添加的顺序,发现了这款境外非法App。经查,后面添加的如果有同样名称的配置,该团伙联合市区多家娱乐场所酒水销售经理,后面的覆盖前面的。
分层的配置
需要了解的是配置的键值形式:
键是分层的,通过线上线下相结合的方式频繁开展网络招嫖活动。2021年5月25日,在中分层以冒号分隔,抓捕时机成熟。汕头市公安组织810名警力,另外需要注意的环境变量中有些不一样的地方。
所有的配置值都是默认字符串类型。
关于键的分层,对汕头多个高档星级酒店、公寓开展集中收网行动,我们先看一个配置文件的例子:
"Position":{
"Title":"Editor",
"Name":"Joe Smith"
}
这个配置里有两对配置,分别键值对应为:
另外需要注意的是目前在多数的配置提供者中都是以冒号":"来分隔,但是在环境变量里,冒号不是所有的平台都支持,但是双下划线所有平台都支持,并且环境变量里的双下划线"__" 会在里自动转为":"
另外需要注意的是,在中默认定义环境变量前缀为, 在中环境变量前缀定义为`ASPNETCORE__'
所以上述的环境变量中可以这样定义:
exportDOTNET_Position__Title="Editor"
exportDONTNET_Position__Name="Joe Smith"
或者在中:
exportASPNETCORE_Position__Title="Editor"
exportASPNETCORE_Position__Name="Joe Smith"
需要注意的是这个默认的前缀是可以更改的,可以通过如下的形式进行更改:
publicclassProgram
{
publicstaticvoidMain(string[]args)
{
CreateHostBuilder(args).Build().Run();
}
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config)=>
{
config.AddEnvironmentVariables(prefix:"MyCustomPrefix_");
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
}
使用环境变量标识一个数组,例如:
环境变量表示为:
使用命令行参数
很简单,看两个例子:
dotnet run MyKey="My key from command line"Position:Title=Cmd Position:Name=Cmd_Rick
或者:
dotnet run --MyKey"Using --"--Position:Title=Cmd-- --Position:Name=Cmd--Rick
使用DI来使用配置服务
我们在那一节里已经学过了,配置服务是几个在初始化的时候已经初始化的服务之一,因此它可以很容易的在所有方法中使用,我们来看一个简单的例子:
{
"Position":{
"Title":"Editor",
"Name":"Joe Smith"
},
"MyKey":"My appsettings.json Value",
"Logging":{
"LogLevel":{
"Default":"Information",
"Microsoft":"Warning",
"Microsoft.Hosting.Lifetime":"Information"
}
},
"AllowedHosts":"*"
}
我们看一下如何从DI中使用这个配置:
publicclassTestModel:PageModel
{
// requires using Microsoft.Extensions.Configuration;
privatereadonlyIConfigurationConfiguration;
publicTestModel(IConfigurationconfiguration)
{
Configuration=configuration;
}
publicContentResultOnGet()
{
varmyKeyValue=Configuration["MyKey"];
vartitle=Configuration["Position:Title"];
varname=Configuration["Position:Name"];
vardefaultLogLevel=Configuration["Logging:LogLevel:Default"];
returnContent($"MyKey value:\n"+
$"Title:\n"+
$"Name:\n"+
$"Default Log Level:");
}
}
键和值的说明
键和值都不区分小写。
如果在多个配置提供者中提供了同样的键,那么按照之间的顺序,后面提供的值覆盖之前的配置提供者。
键的分级(分层)
在配置API中以冒号":"作为分层分隔符
在环境变量里使用双下划线作为分隔符"__"
在中,分层分隔符使用"--"
配置绑定支持数组绑定,请参考之前的数组绑定的方法。
链接字符串 (Connect String)
在环境变量里有四类前缀的关于链接字符串的特殊变量,在环境变量里以:
CUSTOMCONNSTR_
MYSQLCONNSTR_
SQLAZURECONNSTR_
SQLCONNSTR_
这读入之后,移除前缀,后面的,放入到配置中的 节中。
文件配置源
文件配置源包括如下几种:
INI文件配置源
JSON文件配置源
XML文件配置源
给出一个实例,如何添加新的配置提供者:
publicclassProgram
{
publicstaticvoidMain(string[]args)
{
CreateHostBuilder(args).Build().Run();
}
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config)=>
{
config.Sources.Clear();
varenv=hostingContext.HostingEnvironment;
config.AddIniFile("MyIniConfig.ini", optional:true, reloadOnChange:true)
.AddIniFile($"MyIniConfig..ini",
optional:true, reloadOnChange:true);
config.AddEnvironmentVariables();
if(args!=null)
{
config.AddCommandLine(args);
}
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
}
需要注意的是的方法`ConfigureAppConfiguration(hostingcontext, config)
如下是INI文件的格式:
MyKey="MyIniConfig.ini Value"
[Position]
Title="My INI Config title"
Name="My INI Config name"
[Logging:LogLevel]
Default=Information
Microsoft=Warning
如下是XML的配置:
其他两种基本类似。
Endpoint配置
有三种方式用于配置的Endpoint:
扩展方法
命令行参数
环境变量
配置文件
Exles:
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
webBuilder..UseUrls("http://*:5000;http://localhost:5001;https://hostname:5002");
});
"Kestrel":{
"Endpoints":{
"Https":{
"Url":"https://localhost:9999"
}
}
}
的方法
提供了一些方法用户配置。
实例:
publicclassTestNumModel:PageModel
{
privatereadonlyIConfigurationConfiguration;
publicTestNumModel(IConfigurationconfiguration)
{
Configuration=configuration;
}
publicContentResultOnGet()
{
varnumber=Configuration.GetValue("NumberKey",99);
returnContent($"");
}
}
GetSection, GetChildren, and Exists
我们按照上述顺序一一看下demo code:
publicclassProgram
{
publicstaticvoidMain(string[]args)
{
CreateHostBuilder(args).Build().Run();
}
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config)=>
{
config.AddJsonFile("MySubsection.json",
optional:true,
reloadOnChange:true);
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
}
载入配置,并且配置了属性, 。
publicclassTestSectionModel:PageModel
{
privatereadonlyIConfigurationConfig;
publicTestSectionModel(IConfigurationconfiguration)
{
Config=configuration.GetSection("section1");
}
publicContentResultOnGet()
{
returnContent(
$"section1:key0: ''\n"+
$"section1:key1: ''");
}
}
publicclassTestSection4Model:PageModel
{
privatereadonlyIConfigurationConfig;
publicTestSection4Model(IConfigurationconfiguration)
{
Config=configuration;
}
publicContentResultOnGet()
{
strings=null;
varselection=Config.GetSection("section2");
if(!selection.Exists())
{
thrownewSystem.Exception("section2 does not exist.");
}
varchildren=selection.GetChildren();
foreach(varsubSectioninchildren)
{
inti=;
varkey1=subSection.Key+":key"+i++.ToString();
varkey2=subSection.Key+":key"+i.ToString();
s+=key1+" value: "+selection[key1]+"\n";
s+=key2+" value: "+selection[key2]+"\n";
}
returnContent(s);
}
}
存取配置值
类中
在类中存取配置。由于配置在host配置里就已经初始化了,因此在类中可以通过DI存取:
publicclassStartup
{
publicStartup(IConfigurationconfiguration)
{
Configuration=configuration;
}
publicIConfigurationConfiguration {get; }
publicvoidConfigureServices(IServiceCollectionservices)
{
services.AddRazorPages();
Console.WriteLine($"MyKey :");
}
publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv)
{
Console.WriteLine($"Position:Title :");
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints=>
{
endpoints.MapRazorPages();
});
}
}
中
先引用类:
MVC View file
@usingMicrosoft.Extensions.Configuration
@inject IConfiguration Configuration
Configurationvaluefor'MyKey': @Configuration["MyKey"]
在控制器中添加配置值
关于这个分可以参考基于
我们除了直接引用的程序实例之外,还可以使用来存取配置,我们下一节来学。
往期文章目录:
ASP.net Core基础
AzureDeveloper,一个分享和学Azure技术的好去处,欢迎关注
免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!
标签: