本文结构


  1. 提前准备
  2. 参数配置方式
    1. appsettings.json
    2. 环境变量
    3. 命令行参数
  3. 在控制器中使用配置参数
    1. 注入IConfiguration对象
    2. 注入IOptions对象
  4. 总结

应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务(比如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应用程序的参数配置及使用(转载)的更多相关文章

  1. Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器

    前言: 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序,以及配置Nginx反向代理服务器.因为公司的项目一直都是托管在 ...

  2. ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)(转载)

    本文结构 ASP.NET Core应用程序的构建 ASP.NET Core应用程序容器化所需注意的问题 应用程序的配置信息 端口侦听 ASP.NET Core的容器版本 docker镜像构建上下文(B ...

  3. 尝试在Linux上部署Asp.net Core应用程序

    快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用. 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 ...

  4. 15.ASP.NET Core 应用程序中的静态文件中间件

    在这篇文章中,我将向大家介绍,如何使用中间件组件来处理静态文件.这篇文章中,我们讨论下面几个问题: 在ASP.NET Core中,我们需要把静态文件存放在哪里? 在ASP.NET Core中 wwwr ...

  5. ASP.NET Core 应用程序Startup类介绍

    Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...

  6. asp.net core 教程(五)-配置

    Asp.Net Core-配置 Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以 ...

  7. ASP.NET Core 应用程序Startup类介绍 (转载)

    Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...

  8. 使用 Docker 在 Linux 上托管 ASP.NET Core 应用程序

    说在前面 在阅读本文之前,您必须对 Docker 的中涉及的基本概念以及常见命令有一定了解,本文侧重实战,不会对相关概念详述. 同时请确保您本地开发机器已完成如下安装: Docker 18.06 或更 ...

  9. 5种设置ASP.NET Core应用程序URL的方法

    默认情况下,ASP.NET Core应用程序监听以下URL: http://localhost:5000 https://localhost:5001 在这篇文章中,我展示了5种不同的方式来更改您的应 ...

随机推荐

  1. Django框架(六)--模板层:变量、过滤器、标签、自定义标签和过滤器

    将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def c ...

  2. Nginx 反向代理功能-实现Nginx tcp负载均衡

    Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. React源码 memo Fragment StrictMode cloneElement createFactory

    1.memo react 16.6 推出的 api ,他的用意是给 function component 也有 PureComponent 这样一个类似的功能,因为我们知道 PureComponent ...

  4. php状态模式(state pattern)

    ... <?php /* The state pattern encapsulates the varying behavior for the same object based on its ...

  5. locust手机号批量注册性能测试

    from locust import TaskSet,task,HttpLocust from common.redisCon import redis_clusters import queue c ...

  6. wordpress调用自定义post_type文章

    前面我们讲了wordpress添加post_type自定义文章类型,我们现在来讲一下如何把自定义文章调用出来,我们以product为例,虽然我们自定义好了 Post Type 同时也编写了一些内容,但 ...

  7. NOIP 2015 推销员

    洛谷 P2672 推销员 洛谷传送门 JDOJ 2994: [NOIP2015]推销员 T4 JDOJ传送门 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...

  8. postfix发邮件失败,日志和postqueue -p提示No route to host

    1.  防火墙未放行相关端口 2

  9. webpack中路径的理解

    webpack 前端打包工具, 开发人员要面对的路径主要是: 打包前的路径(开发环境路径)和打包后的路径(生产环境路径) 在webpack.config.js中配置的output.path, outp ...

  10. selenium--单选框和复选框的操作

    单选框操作 from selenium import webdriver import unittest class Test_radio(unittest.TestCase): def test_S ...