配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙、上传格式与大小限制等等。

ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息。

ASP.NET Core项目启动时默认加载的配置有:

  • 命令行参数
  • 环境变量
  • appsettings.json、appsettings.Environment.json、appsettings.Production.json等

【示例代码下载

常用的配置提供程序

ASP.NET Core常用的配置Provider有:

  • CommandLineConfigurationProvider(命令行配置)
  • EnvironmentVariablesConfigurationProvider(环境变量配置)
  • FileConfigurationProvider(文件配置)

命令行配置

命令行配置Provider通过读取应用启动时的命令行参数来设置配置项。

默认情况下,在命令行上设置的配置值会替换通过所有其他配置提供程序设置的配置值。

支持的命令格式

  • 无前缀的key=value模式
  • 双中横线模式--key=value或--key value
  • 正斜杠模式 /key=value或/key value

注:等号分隔符和空格分隔符不能混用

命令替换模式

  • 必须以单划线(-)或双划线(--)开头
  • 映射字典不能包含重复Key

注:使用单划线时,代表需要替换的占位符,必须进行替换,不然会报错。

配置位置

{
"profiles": {
"ConfigurationProviderSample.ConsoleApp": {
"commandName": "Project",
"commandLineArgs": "MyKey1=cmd --MyKey3=cmd /MyKey6=cmd --k1=k3",
"environmentVariables": {
"MyKey2": "situation"
}
}
}
}

在launchSettings.json文件里的profiles.[项目名].commandLineArgs属性。

代码示例:

class Program
{
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder(); // 加载命令行参数
builder.AddCommandLine(args); //// 替换参数,注意要去命令行参数那里把双划线--k1改成单划线-k1,并且要注释上面一句代码。
//var mapper = new Dictionary<string, string>() { { "-k1", "MyKey7" } };
//builder.AddCommandLine(args, mapper); var configurationRoot = builder.Build();
Console.WriteLine($"MyKey1:{configurationRoot["MyKey1"]}");
Console.ReadKey();
}
}

输出结果:

环境变量配置

环境变量配置,通过读取操作系统的环境变量参数来设置配置项。

适用场景

  • 在Docker中运行
  • 在Kubernetes中运行
  • 需要设置ASP.NET Core的一些内置特殊配置时

特性

  • 对于配置的分层键,支持用双下划线(__)代替冒号(:)。在Linux中是支持冒号(:)
  • 支持根据前缀加载

代码示例:

class Program
{
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder(); // 分层键
builder.AddEnvironmentVariables();
var configurationRoot = builder.Build(); Console.WriteLine($"MyKey2:{configurationRoot["MyKey2"]}"); var section = configurationRoot.GetSection("SECTION1");
Console.WriteLine($"MyKey2:{section["MyKey2"]}"); // 支持多重分层
var section2 = configurationRoot.GetSection("SECTION1:SECTION2");
Console.WriteLine($"MyKey2:{section2["MyKey2"]}");
Console.ReadKey(); //// 前缀过滤 //builder.AddEnvironmentVariables("PREFIX_"); //var configurationRoot = builder.Build(); //Console.WriteLine($"MyKey2:{configurationRoot["MyKey2"]}");
//Console.ReadKey();
}
}

文件配置

常用的文件格式有:ini、json和xml。

特性

  • 指定文件可选、必选。
  • 指定是否监听文件的变更。

示例代码:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// 普通加载文件
config.AddJsonFile("appsettings.json"); // 演示指定文件可选
config.AddJsonFile("appsettings.Development.json", true); // 演示指定文件变更
config.AddJsonFile("appsettings.Production.json", false, true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

注:最终配置项的值跟文件加载的顺序有关。

配置优先级

当同时使用命令行配置、环境变量配置、文件配置,并且有相同配置项名字时,如何判断使用哪个配置项。

使用ASP.NET Core项目的默认模板,通过修改文件launchSettings.jsoncommandLineArgsenvironmentVariables

    "ConfigurationProviderSample": {
"commandName": "Project",
"commandLineArgs": "MyKey1=cmd --MyKey3=cmd /MyKey6=cmd --k1=k3",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"MyKey2": "situation",
"SECTION1__MyKey2": "hello world",
"SECTION1__SECTION2__MyKey2": "hi world",
"PREFIX_MyKey2": "hello world"
}
}

另外,appsettings.json如下:

{
"MyKey1": "appsettings.json",
"MyKey2": "appsettings.json",
"MyKey3": "appsettings.json",
"MyKey4": "appsettings.json",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

结果如下:

通过上述结果可知,当同时使用命令行配置、环境变量配置、文件配置时,优先级是:命令行 > 环境变量 > 文件。

如何使用配置

上面介绍了如何加载配置,下面介绍如何在ASP.NET Core中使用配置。下面介绍三种常用的方式:

  • 在Startup中使用配置
  • 在Razor Pages中使用配置
  • 在MVC视图中使用配置

在Startup中使用配置

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
Console.WriteLine($"MyKey : {Configuration["MyKey"]}");
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
Console.WriteLine($"Position:Title : {Configuration["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();
});
}
}

在Razor Pages中使用配置

通过inject语法注入配置对象IConfiguration。

@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration Configuration value for 'MyKey': @Configuration["MyKey"]

在Startup.ConfigureServices中配置MyOptions。

public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(Configuration.GetSection("MyOptions")); services.AddRazorPages();
}

通过inject注入。

@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@inject IOptions<MyOptions> optionsAccessor <p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>

在MVC视图中使用配置

方式与Razor Pages类似。

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration Configuration value for 'MyKey': @Configuration["MyKey"]
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(myOptions =>
{
myOptions.Option1 = "Value configured in delegate";
myOptions.Option2 = 500;
}); services.AddRazorPages();
}

可通过Model类注入配置来初始化。

public class Test2Model : PageModel
{
private readonly IOptions<MyOptions> _optionsDelegate; public Test2Model(IOptions<MyOptions> optionsDelegate )
{
_optionsDelegate = optionsDelegate;
} public ContentResult OnGet()
{
return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
$"Option2: {_optionsDelegate.Value.Option2}");
}
}

[ASP.NET Core开发实战]基础篇06 配置的更多相关文章

  1. [ASP.NET Core开发实战]基础篇03 中间件

    什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...

  2. [ASP.NET Core开发实战]基础篇02 依赖注入

    ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...

  3. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  4. [ASP.NET Core开发实战]基础篇05 服务器

    什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器. Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用. ...

  5. [ASP.NET Core开发实战]基础篇04 主机

    主机定义 主机是封闭应用资源的对象. 设置主机 主机通常由 Program 类中的代码配置.生成和运行. HTTP项目(ASP.NET Core项目)创建泛型主机: public class Prog ...

  6. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  7. [ASP.NET Core开发实战]开篇词

    前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...

  8. ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

    先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...

  9. 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

随机推荐

  1. 牛客练习赛64 红色的樱花 exgcd 贪心

    LINK:The red sakura 暴怒狂樱 血染京都. 这题质量不咋地 这题也没啥营养. 不过还是存在值得学习的地方的. 一个trick n行 m列 第一行与第n行相连 第1列和第m列相连的时候 ...

  2. bzoj 2225 [Spoj 2371]Another Longest Increasing

    这道题 连续上升的三元组 且已经按照第一维排好序了. 直接上CDQ分治即可 当然也是可以2-Dtree解决这个 问题 但是感觉nlog^2 比nsqrt(n)要快一些.. 算是复习一发CDQ分治吧 也 ...

  3. stm32f407 oled iic例程,成功点亮oled屏

    写了好久好久,写好多好多代码,终于把oled给驱起来了.话不多说,直接上图,欲要例程的,可以加我微 lichenpoo

  4. Android Studio--家庭记账本(二)

    家庭记账本APP目前实现了记账功能,也就是说增加功能,今天打算添加删除功能,参考着增加的代码研究,从网上查阅资料,打算实现左滑删除功能,目前学到了xml里面的HorizontalScrollView布 ...

  5. Flink中的window、watermark和ProcessFunction

    一.Flink中的window 1,window简述  window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...

  6. 朴素贝叶斯算法java实现(多项式模型)

    网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...

  7. idea如何打war包(不使用maven)

    用多了maven的小伙伴,应该快忘了怎么不用maven打war包了吧,我也快忘了,所以趁我还记得,赶紧记录下来,多年后,当我回忆起往事........ 而且网上的教程也太坑了吧,牛头不搭马嘴,这害死多 ...

  8. 下载的附件名总乱码?你该去读一下 RFC 文档了!

    纸上得来终觉浅,绝知此事要躬行 Web 开发过程中,相信大家都遇到过附件下载的场景,其中,各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已. 网上搜索一下,大部分都是通过Request Head ...

  9. Educational Codeforces Round 93 (Rated for Div. 2)题解

    A. Bad Triangle 题目:https://codeforces.com/contest/1398/problem/A 题解:一道计算几何题,只要观察数组的第1,2,n个,判断他们能否构成三 ...

  10. 设计模式详解及Python实现

    设计模式及Python实现 设计模式是什么? Christopher Alexander:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心*.这样你就能一次又一 ...