文章目录
启动配置信息
项目启动的时候,将会获取launchsettings.json设置信息。
- 我们可以在项目根目录的Properties文件夹中找到此文件
- 当我们使用Visual Studio或.NET Core CLI运行此ASP.NET Core项目时,将使用此文件中的设置
- 此文件仅用于本地开发环境,我们不需要把它发布到生产环境的ASP.NET Core程序中
- 如果希望在使用ASP.NET Core发布和部署应用程序时采用某些独立的设置,请将它们存储在appsettings.json文件中。我们通常将应用程序的配置信息存储在此文件中,比如数据库连接字符串
- 还可以使用不同环境的appsettings.json文件。比如,appsettings.Staging.json用于临时环境。
- 在ASP.NET Core中,除appsettings.json文件外,我们还可以采用其他的配置源,如环境变量,用户机密(User Secret)、命令行(Command Line)参数,甚至自定义配置源
打开launchSettings.json,可以看到文件中的设置信息如下:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:3682",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication6": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
请注意:我们有两个配置信息。
- IIS Express
- WebApplication6
当我们通过F5键从Visual Studio中运行项目时。
- 默认情况下,调用配置文件名称“commandName”:“IIS Express”
- 另外一种情况,如果我们使用.NET Core CLI(dotnet run)运行项目,则使用带有“command Name”:“Project”的配置文件
我们可以通过单击Visual Studio中的下拉列表来更改要配置文件中的commandName属性,修改默认设置。
默认值如下:
- 项目名称(现在显示的时WebApplication6)
- IIS Express
- IIS
图中所示的值与项目文件中的元素的值对应,当选择的值不同时,会指定要启动的是内部服务器还是外部服务器(反向代理服务器),详情如下表:
commandName | AspNetCoreHostingModel的值 | Internal Web Server(内部服务器) | External Web Server(外部服务器) |
---|---|---|---|
项目名称 | 忽略托管设置的值 | 只使用一个Web服务器—IIS Express | 只使用一个Web服务器—IIS Expresss |
IIS Express | 进程内托管InProcess | 只使用一个Web服务器—IIS Express | 只使用一个Web服务器—IIS Express |
IIS Express | OutOfProcess | Kestrel | IIS Express |
IIS | InProcess | 只使用一个Web服务器—IIS | 只使用一个Web服务器—IIS |
IIS | OutOfProcess | Kestrel | IIS |
我们还可以通过直接编辑launchSettings.json文件来设置commandName的值,也可以使用Visual Studio提供的图形用户界面更改设置。
通过GUI来设置launchSettings文件
在Visual Studio的解决方案资源管理器中右击项目名称,然后从快捷菜单中选择属性。单击项目属性窗口中的调试选项卡,如图所示
我们可以使用GUI来更改launchSettings.json文件中的设置
注意,环境变量ASPNETCORE_ENVITONMENT的默认值为Development。
可以将此值更改为Staging或Production,具体取决于我们是在Staging还是Production环境中运行了此项目。
我们还可以添加新的环境变量。这些环境变量在ASP.NET Core应用程序中都可用,可以根据这些环境变量的值的不同,有条件地执行代码。
在这里将环境变量ASPNETCORE_ENVIRONMENT设置为Production。保存后打开launchSettings.json文件,发现IIS Express中的ASPNETCORE_ENVIRONMENT值已经修改为Production。
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
},
比如,参考Startup.cs文件下Configure()方法的以下代码。
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//其他代码
}
这段代码的意思是仅当环境变量值为Development时,程序发生异常才会显示开发异常页面。
ASP.NET Core appsettings.json文件
在传统的Asp.Net版本中,我们将应用程序配置(数据库连接字符串)存储在web.config文件中。
在ASP.Net Core中,应用程序配置可以来自以下不同的配置源。
- appsettings.json和appsettings.{Environment}.json文件可以根据Environment的不同托管在对应环境。
- User Secret(用户机密)
- Environment variables(环境变量)
- Command-line arguments(命令行参数)
appsettings.json文件:我们的项目是通过ASP.NET Core内置的“空”模板创建的,所以项目中已经有一个appsettings.json文件了。
可以对该文件做如下修改,补充一个MyKey的键值对。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"MyKey": "appsettings.json中MyKey的值"
}
访问配置信息
若要访问Startup类中的配置信息,则需要在其中注入IConfiguration服务,它是由ASP.NET Core框架提供的。
public class Startup
{
private IConfiguration _configuration;
//需要先添加一个构造方法,然后将IConfiguration服务注入方法中
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
//防止乱码
context.Response.ContentType = "text/plain;charset=utf-8";
//注入后通过_configuration访问MyKey
await context.Response.WriteAsync(_configuration["MyKey"]);
});
//其他代码
}
}
此时运行项目仍然出现乱码,我们还需要将appsettings.json文件的编码格式修改为UTF-8。打开文件后,单击Visual Studio标签栏上的文件,选择appsettings.json另存为,然后根据编码保存选择如图所示的UTF-8无签名。
保存完毕后,执行程序即可得到没有乱码的值。
appsettings.json
在我们的项目中,appsetings.json文件旁还有一个appsettings.Development.json,现在打开它并添加一个MyKey的键值对。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"MyKey": "appsettings.Developmen.json中MyKey的值"
}
此时运行项目,会发现浏览器显示的值没有变化,这是因为在launchSettings.json中,将ASPNETCORE_ENVIRONMENT的值修改为了Production。这告诉项目,采用IIS Express启动的时候当前的环境变量为Production,因此appsettings.Development.json的文件没有被读取,而是去读取apppsettings.json中的值。
现在只要将启动配置文件中的Production修改回Development,运行项目后就可以看到MyKey的值已经是appsettings.Development.json中MyKey的值。
当然,如果不想修改launchSettings.json中的值,则可以通过CLI命令行的形式运行项目,也可以通过在Visual Studio标签栏上选择WebApplication6(项目名称)的方式启动项目得到相同的结果。
用户机密
在应用程序的开发过程中,有时需要在代码中保存一些机密信息,比如加密密钥、字符串、用户名或密码等。通常的做法是将其保存到一个配置文件(如appsettings.json)中。但是在设计以下场景的时候就会发现该文件不够用了。
- 需要保存一些和第三方网站对接的密钥,比如微信、支付宝或微博站点使用的密钥
- 在团队协同开发的过程中,开发人员在使用各自本机的数据库时,如何配置数据库地址、账号和密码。
那么此时用户机密就排上用场了,接下来我们启动它,首先右击项目名,选择管理用户机密
Visual Studio会自动创建并打开一个名为secrets.json的文件,我们在文件中添加一行代码。
{
"MyKey": "secrets.json中的MyKey的值"
}
然后打开项目文件(点击项目名称即可),会发现在PropertyGroup下添加了一行代码
<UserSecretsId>17b0458c-c095-4825-a1ff-90fc77af6861</UserSecretsId>
在这里,元素中的值代表了用户机密在本地计算机存储的ID,它是由一串GUID的值组成的。
我们可以通过在Visual Studio标签栏上右击secrets.json文件,选择打开所在的文件夹查看,会自动跳到系统文件路径。
%APPDATA%\Microsoft\UserSecrets\<User_Secrets_Id>\secrets.json
在上面的文件路径中,<User_Secrets_Id>与在项目文件中UserSecretsId中的值是相同的。
用户机密保存在本地计算机中,然后通过UserSecrets的值来替换配置信息,现在运行项目得到的输出结果如图所示。
环境变量
现在可以打开launchSettings.json文件,在IIS Express中的environmentVariables添加MyKey的键值对。
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"MyKey": "launchSettings.json中的MyKey的值"
}
},
运行项目后得到的输出结果如图所示
命令行参数
现在我们再通过使用命令行参数的方式来访问配置信息。
首先打开项目的根目录,然后在资源管理器的地址栏中输入powershell(cmd也可),按Enter键,系统会打开命令行工具,它会自动帮我们填写路径信息,如图所示
输入命令dotnet run MyKey=“Value from Command Line”,然后访问http://localhost:5000,得到的结果如图所示
如图所示,我们通过.NET Core CLI命令行来运行项目,然后通过命令行参数的形式设置了MyKey的值。
ASP.NET Core IConfiguration服务与依赖注入
前面在Startup类构造函数中注入的IConfiguration服务采用的是依赖注入的形式。
- IConfiguration服务是为从ASP.NET Core中的所有配置源读取配置信息而设计的
- 如果在多个配置源中具有密钥名称相同的配置中设置,简单来说就是重名了,则后面的配置源将覆盖前面的配置源,所以我们刚刚访问了各种配置源,但是不删除之前的配置信息,原因就是我们通过配置源的读取顺序来设置MyKey的值
- 静态类Host的CreateDefaultBuilder()方法在应用程序启动时会自动去调用,按特定顺序读取配置源。
- 要确认配置源的读取顺序,可以查看ASP.NET Core的源代码,查看GitHub上的源代码上的ConfigureAppConfiguration() 方法。查看后就可知道读取各种配置源的顺序如下。
- appsettings.json
- appsettings.{Environment}.json
- 用户机密
- 环境变量
- 命令行参数
总结
在实际开发项目的过程中会遇到各种突发情况,到时候可以根据不同的情况采用不同的配置源来适配自己需要的服务,知晓不同的配置源的默认读取顺序,有利于排查问题以及保证系统的安全性。