• .net 温故知新【15】:Asp.Net Core WebAPI 配置


    关于Asp.Net Core中的配置实际之前我已经整理过.net 中以json方式进行配置的介绍(.net 温故知新:【8】.NET 中的配置从xml转向json),当时我们说Asp.Net Core也是按照基础方法,只是组织形式的问题,有个封装过程。所以我这里就着重介绍一下Asp.Net Core中配置的重点。

    1、主机配置和应用程序配置

    ASP.NET Core 应用配置和启动“主机”。 主机负责应用程序启动和生存期管理。 ASP.NET Core 模板创建的 WebApplicationBuilder 包含主机。 虽然可以在主机和应用程序配置提供程序中完成一些配置,但通常,只有主机必需的配置才应在主机配置中完成。

    主机配置和应用程序配置是什么意思呢,可以粗略的理解为我们ASP.NET Core 项目启动的时候要用到的一些配置为主机配置,而程序运行阶段使用的配置为应用程序配置。

    而ASP.NET Core 包含一些默认的主机和应用程序配置,我们先看看这些默认配置在哪里以及配置的规范。

    2、默认主机配置

    image

    从文档描述可以看到,默认主机配置是的优先级为:

    命令行-> DOTNET_ 为前缀的环境变量->ASPNETCORE_ 为前缀的环境变量

    并且部分变量是锁定在启动阶段,不受其他配置的影响:

    image

    命令行可以通过启动程序设置,比如:dotnet run --environment Production

    而其他的则可以直接设置系统环境变量,并且按照前缀优先。由于去系统设置比较麻烦,且设置后可能还需要重启VS,所以提供一些能便捷设置的能力。

    launchSettings.json 仅在本地开发计算机上使用,包含配置文件设置。可以设置启动方式和相应的环境变量。

    {
      "$schema": "https://json.schemastore.org/launchsettings.json",
      "iisSettings": {
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:21115",
          "sslPort": 44325
        }
      },
      "profiles": {
        "http": {
          "commandName": "Project",
          "dotnetRunMessages": true,
          "launchBrowser": true,
          "launchUrl": "swagger",
          "applicationUrl": "http://localhost:5007",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "https": {
          "commandName": "Project",
          "dotnetRunMessages": true,
          "launchBrowser": true,
          "launchUrl": "swagger",
          "applicationUrl": "https://localhost:7211;http://localhost:5007",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "IIS Express": {
          "commandName": "IISExpress",
          "launchBrowser": true,
          "launchUrl": "swagger",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }
    
    

    如上是创建项目默认的launchSettings.json文件,在文件中对https、http、IIS Express等配置的ASPNETCORE_ENVIRONMENT都为Development

    ENVIRONMENT 可以配置任意值,框架提供了Development、Staging、Production三种,当没有设置 DOTNET_ENVIRONMENT 和 ASPNETCORE_ENVIRONMENT 时的默认值为Production。

    这就是为什么我们不在开发工具中调试,而是直接运行项目的时候会是Production。

    同时我们如果要自己设置其他值,那么项目中对于使用的地方也要注意,比如appsettings.{Environment}.json 文件名,这个我们稍后讲。

    这个值在Program.cs中是最好的体现,当是Development时启用swagger:

    image

    3、默认应用程序配置

    image

    默认应用程序配置是的优先级为:

    命令行-> 非前缀的环境变量->Development环境中用户机密配置->appsettings.{Environment}.json-> appsettings.json->主机配置(非锁定)

    命令行配置和非前缀环境变量不用说了,接着就是用户机密文件,稍后我们单独说下机密文件。

    然后再加载appsettings.{Environment}.json文件,这个文件是根据上面主机配置的环境变量ENVIRONMENT加载的,比如你配置ENVIRONMENT=AA,那么json文件应为appsettings.AA.json。

    image

    当读取了环境变量的json后就读取appsettings.json文件,该文件一般是正式部署中使用。

    最后就是主机配置相关的变量,这部分优先级比较高。

    (注意:这些配置的读取由配置提供程序实现,也就决定了他们不同的功能或者实现,提供程序这个概念和设计是.net 中大面积使用的,可以从这个部分去理解)

    4、配置机密文件

    机密管理器工具可用于存储开发环境中的机密,比如开发过程中用到的一些数据库配置,这个机密文件不在项目目录下,所以不会被上传到代码管理工具,例如git或者svn。

    右键项目->管理用户机密
    image

    我们看到这个文件是在C盘下,而且文件夹名是一串编码,该编码在项目文件中已经自动配置好了。
    image

    image

    5、使用配置

    使用依赖注入的方式将IConfiguration注入,之后我们写一个测试获取上面我们配置的用户机密文件里面SecretKey的值。

    namespace WebAPI_Config.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class TestController : ControllerBase
        {
            private IConfiguration _configuration;
            public TestController(IConfiguration configuration)
            {
                _configuration = configuration;
            }
    
    
            [HttpGet]
            public string Get()
            {
                return _configuration.GetValue(typeof(string), "SecretKey").ToString();
            }
        }
    }
    

    如果对依赖注入不了解的可以看看我的另外一篇:.net 温故知新:【7】IOC控制反转,DI依赖注入

    测试接口可以看到已经获取到了对应的值。
    image

  • 相关阅读:
    Flink之状态TTL机制
    【学习笔记】杜教筛
    UI设计师(界面设计)面试题
    SSM复习面试题
    条码工具 Dynamic Web TWAIN HTML5 版本的工作原理
    【UML】类图Class Diagram
    【毕业设计】深度学习YOLOv5车辆颜色识别检测 - python opencv
    【Vue】Setup 函数的使用
    Scrapy设置代理IP方法(超详细)
    在EC2上对SELinux故障进行紧急恢复以及排查的思路及方法
  • 原文地址:https://www.cnblogs.com/SunSpring/p/17879703.html