ASP.NET Core应用程序的参数配置及使用(转载)
本文结构
应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务(比如ACS或者Kubernetes)时,这些参数能够被动态地、合理地设置。本文通过最简单的形式,对ASP.NET Core应用程序的不同的配置方式进行介绍,并介绍了在应用程序中如何使用这些配置参数,相信对于ASP.NET Core的开发者会有很大帮助。
提前准备
我们首先使用Visual Studio 2017新建一个ASP.NET Core的应用程序,当然如果没有Visual Studio 2017的话,下载安装了.NET Core SDK之后,使用dotnet new命令也能创建ASP.NET Core应用程序,然后使用你平时习惯使用的编辑器进行代码编辑。我还是建议使用Visual Studio 2017,社区版(Community版)是完全免费的,功能上与专业版和企业版也没多大区别。免费的宇宙最强IDE,放着不用岂不是浪费么。
言归正传,为了能够方便地看出ASP.NET Core应用程序使用配置数据的方式,我们首先修改Startup.cs文件,加入日志控制台输出的代码。关键代码如下:
public class Startup
{
private readonly ILogger logger; public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
this.logger = logger;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
var mongoHost = Configuration["mongo:server:host"];
logger.LogInformation("MongoDB Server Host: " + mongoHost);
// .... 其它代码省略 ....
}
}
接下来,我们就可以开始做实验了。
参数配置方式
ASP.NET Core提供了多样化的参数配置方式,总结起来,有以下几种常用的参数配置方式:
- 通过appsettings.json文件
- 使用系统环境变量
- 通过命令行进行参数配置
当然,还可以自定义配置文件或者其它的配置方式。不过这里我只打算介绍常规的用法,因为我相信目前ASP.NET Core默认提供的配置方式应该能够满足绝大部分应用场景。如需获取更多有关其它的参数配置方式的详细信息,可以参考微软官方文档。
appsettings.json
appsettings.json文件是ASP.NET Core应用程序的配置文件,通常与应用程序的DLL文件在同一个目录下。通过ASPNETCORE_ENVIRONMENT环境变量可以指定具体使用哪个appsettings.json作为配置文件。比如,如果ASPNETCORE_ENVIRONMENT环境变量的值为Production,那么appsettings.Production.json文件就会被使用。这种根据环境变量来决定配置文件的方式,允许通过一个简单的字符串来决定一系列的参数取值,在实际应用中还是非常方便的。
现在,我们修改appsettings.json文件,将MongoDB的连接信息配置进去:
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*",
"mongo": {
"server": {
"host": "localhost",
"port": 27017
},
"database": "db"
}
}
然后编译应用程序,并将appsettings.json文件复制到编译输出目录,之后在命令行通过dotnet命令启动应用程序:

可以看到,配置数据已经正常输出。接下来,确认一下ASPNETCORE_ENVIRONMENT指定的是Development,因此,我们修改一下appsettings.Development.json文件,使用同样的结构配置MongoDB的连接信息,只不过我们使用localhost_dev来指定mongo:server:host的值:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"mongo": {
"server": {
"host": "localhost_dev",
"port": 27017
},
"database": "db"
}
}
此时,再次启动应用程序,发现配置数据已经更新:

因此,可以使用appsettings.json文件,根据不同的运行环境来选择使用不同的配置参数。
环境变量
appsettings.json文件中已经配置好的参数,可以被环境变量覆盖。我们可以通过set命令,在Windows的命令行中设置一个环境变量:

再次运行应用程序,得到的结果就是环境变量里所设置的参数值:

可以看出,之前由appsettings.json文件指定的参数,已经被环境变量所覆盖。这一特性十分重要,当我们把一个ASP.NET Core应用程序包装成一个docker镜像,并在docker容器中运行时,我们可以方便地使用docker run -e的参数,将环境变量注入进去,并覆盖原来写死在配置文件中的值,这也充分证明了ASP.NET Core对于容器的支持是十分友好的。
命令行参数
在使用dotnet启动应用程序时,可以直接在命令行提供运行时参数,此时命令行参数会覆盖环境变量中的设置,比如:

同样,如果ASP.NET Core应用程序被包装成一个docker镜像,那么我们就可以通过docker exec命令对应用程序进行调试,并直接通过命令行注入调试时所需的参数。
在控制器中使用配置参数
要在控制器中使用配置参数,最常用的有两种方法,第一种是在控制器的构造函数中注入IConfiguration对象,另一种则是自定义一个配置数据模型,然后在控制器的构造函数中注入IOptions对象。
注入IConfiguration对象
以下代码演示了通过构造器注入IConfiguration对象的方式来获取配置信息:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IConfiguration configuration;
public ValuesController(IConfiguration configuration)
{
this.configuration = configuration;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { this.configuration["mongo:server:host"] };
}
}
执行结果如下:

注入IOptions对象
这种方法首先需要根据配置数据的结构,自定义一个用于保存配置数据的类:
public class Server
{
public string Host { get; set; } public int Port { get; set; }
} public class Mongo
{
public Server Server { get; set; } public string Database { get; set; }
}
然后,修改Startup.ConfigureServices方法,将配置注入进来:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.Configure<Mongo>(Configuration.GetSection("mongo"));
// ...
}
最后,在控制器的构造函数中注入IOptions对象:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IOptions<Mongo> configuration;
public ValuesController(IOptions<Mongo> configuration)
{
this.configuration = configuration;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { this.configuration.Value.Server.Host };
}
}
执行结果也是一样的:

总结
本文快速介绍了ASP.NET Core应用程序的基本配置和使用方式,相信对于ASP.NET Core的开发人员会有一定的帮助。ASP.NET Core应用程序的配置还是非常灵活方便的,如果有兴趣深入了解的话,强烈建议阅读微软官方文档,也可以阅读ASP.NET Core的源代码进行深入了解。
ASP.NET Core应用程序的参数配置及使用(转载)的更多相关文章
- Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器
前言: 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序,以及配置Nginx反向代理服务器.因为公司的项目一直都是托管在 ...
- ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)(转载)
本文结构 ASP.NET Core应用程序的构建 ASP.NET Core应用程序容器化所需注意的问题 应用程序的配置信息 端口侦听 ASP.NET Core的容器版本 docker镜像构建上下文(B ...
- 尝试在Linux上部署Asp.net Core应用程序
快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用. 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 ...
- 15.ASP.NET Core 应用程序中的静态文件中间件
在这篇文章中,我将向大家介绍,如何使用中间件组件来处理静态文件.这篇文章中,我们讨论下面几个问题: 在ASP.NET Core中,我们需要把静态文件存放在哪里? 在ASP.NET Core中 wwwr ...
- ASP.NET Core 应用程序Startup类介绍
Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...
- asp.net core 教程(五)-配置
Asp.Net Core-配置 Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以 ...
- ASP.NET Core 应用程序Startup类介绍 (转载)
Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...
- 使用 Docker 在 Linux 上托管 ASP.NET Core 应用程序
说在前面 在阅读本文之前,您必须对 Docker 的中涉及的基本概念以及常见命令有一定了解,本文侧重实战,不会对相关概念详述. 同时请确保您本地开发机器已完成如下安装: Docker 18.06 或更 ...
- 5种设置ASP.NET Core应用程序URL的方法
默认情况下,ASP.NET Core应用程序监听以下URL: http://localhost:5000 https://localhost:5001 在这篇文章中,我展示了5种不同的方式来更改您的应 ...
随机推荐
- linux系统盘扩容操作
linux操作系统原来的50硬盘空间不够用了,如果再加一块60G硬盘,怎样扩容呢?今天我参考了前辈门的文档实际操作了一下,涉及到PV/VG/LV的相关操作. 当50G系统硬盘不够,再挂载一块60G,就 ...
- Linux下远程连接MySQL数据库
估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privi ...
- PHP技术栈
本文旨在给要学习 PHP 的新手一个大概的认知轮廓,在心里有个学习的结构,有的放矢,避免走太多弯路.大神请忽略. 入门阶段 预备知识 1.掌握基本HTML.JS.CSS语法:熟悉 Bootstrap. ...
- 谷歌学术出现We're sorry解决办法
出现这个的原因应该是同ip段的或者就是这个ip曾经是个google的黑名单ip,因为恶意爬取谷歌学术了.解决办法就是申请Hurricane Electric Free IPv6 Tunnel Brok ...
- IE zoom:1
overflow:hidden zoom:1 一起出现克服IE6 bug display:inline-block display:inline zoom:1 一起出现克服IE6bug
- 07-C#笔记-运算符
1. 支持++和-- 含义和C++中相同 2. 条件运算 同C++ 3. 位运算 ^ 异或 ~ 取反 4. 支持?:运算 5. 特殊 is 判断对象是否为某一类型. If( Ford is Car) ...
- mysql数据库锁的机制-及事务事件
事务隔离级别,脏读.不可重复读.幻读,乐观锁.悲观锁(共享锁.排它锁) 数据库事务具有四个特征,分别是原子性(Atomicity).一致性(Consistency).隔离性(Isoation).持久性 ...
- UFUN函数 UF_UI UF_PART函数(UF_UI_select_with_class_dialog, UF_PART_export_with_options)
/*主要演示 UF_PART_export_with_options 这个函数 */1 //设置class_dialog选择过滤 static int init_proc(UF_UI_selectio ...
- STL 二分查找
实现源码:https://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 1.在一个递增的数组(或vector)中查找元素属于[ s , ...
- pose_graph的优化变量和优化函数
1.优化变量 优化变量就是vertex,也就是pose,pose-graph的优化目标就是,调整所有vertex的位置来尽量满足所有边的约束. 上述的还是表层的理解,深一步理解: pose-graph ...