ASP.NET Core Web API 配置系统集成

news2025/5/20 11:20:39

文章目录

  • 前言
  • 一、配置源与默认设置
  • 二、使用步骤
    • 1)创建项目并添加配置
    • 2)配置文件
    • 3)强类型配置类
    • 4)配置Program.cs
    • 5)控制器中使用配置
    • 6)配置优先级测试
    • 7)动态重载配置测试
    • 8)运行结果示例
  • 总结


前言

集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行维护。这样可以提高应用程序的灵活性和可维护性。

ASP.NET Core 提供了一种灵活的配置系统,可以轻松地将配置信息从不同的来源加载到应用程序中,并且可以根据环境变量、命令行参数、JSON 文件、XML 文件、环境变量等不同来源来管理配置。

一、配置源与默认设置

  • ASP.NET Core默认通过CreateDefaultBuilder方法预配置了多种配置源,优先级从低到高依次为:
    • appsettings.json
    • appsettings.{Environment}.json
    • 用户机密(开发环境)
    • 环境变量
    • 命令行参数

二、使用步骤

1)创建项目并添加配置

项目结构

  • AspNetCoreConfiguration
    • Controllers/
      • TestConfigurationController.cs
    • Entity/
      • AppConfig.cs
      • SmtpSettings.cs
    • appsettings.json
      • appsettings.Development.json
    • config.xml
    • Program.cs

2)配置文件

  1. appsettings.json

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "AppConfig": {
        "ApiName": "My API",
        "MaxRecords": 100,
        "EnableCaching": false
      }
    }
    
  2. appsettings.Development.json(开发环境专用)

    {
      "AppConfig": {
        "EnableCaching": true
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      }
    }
    
    
  3. config.xml(自定义XML配置源)

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    	<AppConfig>
    		<ApiName>XMLApiName热重载222</ApiName>
    		<MaxRecords>200</MaxRecords>
    		<EnableCaching>false</EnableCaching>
    	</AppConfig>
    </configuration>
    

3)强类型配置类

  1. AppConfig.cs
    namespace AspNetCoreConfiguration.Entity
    {
        public class AppConfig
        {
            public string ApiName { get; set; }
            public int MaxRecords { get; set; }
            public bool EnableCaching { get; set; }
        }
    }
    
  2. SmtpSettings.cs
    namespace AspNetCoreConfiguration.Entity
    {
        public record SmtpSettings
        {
            public string Server { get; set; }
    
            public string UserName { get; set; }
    
            public string Password {  get; set; }
        }
    }
    

4)配置Program.cs

  1. 示例
    var builder = WebApplication.CreateBuilder(args);
    //注册配置文件及它们的优先级
    builder.Configuration
        .AddJsonFile("mysettings.json", optional: true, reloadOnChange: true)
        .AddXmlFile("config.xml", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables("MyEnvironment_")
        .AddCommandLine(args);
    builder.Services.AddControllers();
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    //配置数据库
    builder.WebHost.ConfigureAppConfiguration((hostCtx, configBuilder) =>
    {
        string connStr = builder.Configuration.GetSection("ConnectionString").Value;
        configBuilder.AddDbConfiguration(() => new SqlConnection(connStr), reloadOnChange: true, reloadInterval: TimeSpan.FromSeconds(2));
    
    });
    
    //配置Redis
    builder.Services.AddSingleton<IConnectionMultiplexer>(sp => {
        return ConnectionMultiplexer.Connect(builder.Configuration.GetSection("Redis").Value);
    });
    
    //绑定配置节到类
    builder.Services.Configure<AppConfig>(builder.Configuration.GetSection("AppConfig"));
    builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));
    
    var app = builder.Build();
    
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
        //开发环境加载用户机密
        builder.Configuration.AddUserSecrets<Program>();
    }
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    

5)控制器中使用配置

  1. TestConfigurationController.cs
    using AspNetCoreConfiguration.Entity;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Options;
    using StackExchange.Redis;
    
    namespace AspNetCoreConfiguration.Controllers
    {
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class TestConfigurationController : ControllerBase
        {
            private readonly IWebHostEnvironment _webHostEnvironment;
            private readonly AppConfig appconfig;
            private readonly SmtpSettings smtpConfig;
            private readonly IConfiguration _configuration;
            private readonly ILogger<TestConfigurationController> logger;
            private readonly IConnectionMultiplexer connectionMultiplexer;
            
            public TestConfigurationController(IWebHostEnvironment webHostEnvironment,
                IOptionsSnapshot<AppConfig> options,//支持配置热重载
                IConfiguration configuration,
                ILogger<TestConfigurationController> logger,
                IConnectionMultiplexer connectionMultiplexer,
                IOptionsSnapshot<SmtpSettings> smtpConfigOptions)
            {
                _webHostEnvironment = webHostEnvironment;
                appconfig = options.Value;
                _configuration = configuration;
                this.logger = logger;
                this.connectionMultiplexer = connectionMultiplexer;
                smtpConfig = smtpConfigOptions.Value;
            }
    
            [HttpGet]
            public string GetRedisOrSmtpConfig() {
                var pingDataBase = connectionMultiplexer.GetDatabase(0).Ping();
                logger.LogInformation($"DatabaseBase:{pingDataBase}");
                logger.LogInformation($"Smtp:{smtpConfig}");
                return "";
    
            }
            [HttpGet]
            public IActionResult GetConfigInfo()
            {
                //return Ok(new { 
                //    ApiName=appconfig.ApiName,
                //    MaxRecords = appconfig.MaxRecords,
                //    EnableCaching = appconfig.EnableCaching
                //});
                logger.LogInformation($"强类型访问appconfig.XXX:{appconfig.ApiName}{appconfig.MaxRecords}{appconfig.EnableCaching}");
                logger.LogInformation($"直接访问_configuration[AppConfig:xxx]:{_configuration["AppConfig:ApiName"]},{_configuration["AppConfig:MaxRecords"]},{_configuration["AppConfig:EnableCaching"]}");
                return Ok(_configuration["AppConfig:ApiName"]+ _configuration["AppConfig:MaxRecords"] + _configuration["AppConfig:EnableCaching"]);
    
            }
            [HttpGet]
            public string GetEnvironmentConfigValue()
            {
                return _webHostEnvironment.EnvironmentName;
            }
        }
    }
    

6)配置优先级测试

通过不同方式覆盖配置值

  1. 命令行参数 (最高优先级):

    AppConfig:ApiName=Bat_ApiName AppConfig:MaxRecords=1000 AppConfig:EnableCaching=true
    

    在这里插入图片描述

  2. 环境变量 (使用双下划线 __):
    在这里插入图片描述

  3. 用户机密 (仅Development环境):

    //配置secrets.json
     {
    	"AppConfig:ApiName": "user_Secrets_ApiName",
    	"AppConfig:MaxRecords": "3000",
      	"AppConfig:EnableCaching": "true",
      }
    

7)动态重载配置测试

  1. 修改 appsettings.jsonconfig.xml 中的值。
  2. 无需重启应用,刷新接口即可看到更新后的值(通过 IOptionsSnapshot<T> 注入)。

8)运行结果示例

  1. 假设配置优先级生效顺序为:用户机密>命令行 > 环境变量 > XML > appsettings.json
  2. 请求响应
    在这里插入图片描述

总结

  1. 配置源优先级:后添加的源优先级更高,用户机密 > 命令行 > 环境变量 > 自定义XML >
    appsettings.{Environment}.json > appsettings.json。
  2. 强类型绑定:通过 services.Configure() 注册,使用
    IOptions<T>/IOptionsSnapshot<T> 注入。
  3. 热重载:确保 reloadOnChange: true,并使用 IOptionsSnapshot<T> 或
    IOptionsMonitor<T>。
  4. 环境变量:使用双下划线 __ 替代层级符号(如 AppSettings__Title)。
  5. 用户机密:仅用于开发环境,通过 dotnet user-secrets 管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何判断单片机性能极限?

目录 1、CPU 负载 2、内存使用情况 3、实时性能 4、外设带宽 5、功耗与温度 在嵌入式系统设计中&#xff0c;当系统变得复杂、功能增加时&#xff0c;单片机可能会逐渐逼近其性能极限。及时识别这些极限点对于保证产品质量、稳定性和用户体验至关重要。 当你的嵌入式系统…

AI在多Agent协同领域的核心概念、技术方法、应用场景及挑战 的详细解析

以下是 AI在多Agent协同领域的核心概念、技术方法、应用场景及挑战 的详细解析&#xff1a; 1. 多Agent协同的定义与核心目标 多Agent系统&#xff08;MAS, Multi-Agent System&#xff09;&#xff1a; 由多个独立或协作的智能体&#xff08;Agent&#xff09;组成&#xff…

1.凸包、极点、极边基础概念

目录 1.凸包 2.调色问题 3.极性(Extrem) 4.凸组合(Convex Combination) 5.问题转化(Strategy)​编辑 6.In-Triangle test 7.To-Left-test 8.极边&#xff08;Extream Edges&#xff09; 1.凸包 凸包就是上面蓝色皮筋围出来的范围 这些钉子可以转换到坐标轴中&#xff0…

OSCP - Proving Grounds - DriftingBlues6

主要知识点 路径爆破dirtycow内核漏洞提权 具体步骤 总体来讲&#xff0c;这台靶机还是比较直接的&#xff0c;没有那么多的陷阱,非常适合用来学习 依旧是nmap开始,只开放了80端口 Nmap scan report for 192.168.192.219 Host is up (0.42s latency). Not shown: 65534 cl…

深度理解指针之例题

文章目录 前言题目分析与讲解涉及知识点 前言 对指针有一定了解后&#xff0c;讲一下一道初学者的易错题 题目分析与讲解 先定义一个数组跟一个指针变量 然后把数组名赋值给指针变量————也就是把首地址传到pulPtr中 重点是分析这一句&#xff1a; *&#xff08;pulPtr…

LeetCode算法题(Go语言实现)_51

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;两者长度都是 n &#xff0c;再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。 对于选择的下标 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 分数 …

Solon AI MCP Server 入门:Helloworld (支持 java8 到 java24。国产解决方案)

目前网上能看到的 MCP Server 基本上都是基于 Python 或者 nodejs &#xff0c;虽然也有 Java 版本的 MCP SDK&#xff0c;但是鲜有基于 Java 开发的。 作为Java 开发中的国产顶级框架 Solon 已经基于 MCP SDK 在进行 Solon AI MCP 框架开发了&#xff0c;本文将使用 Solon AI …

公司内部自建知识共享的方式分类、详细步骤及表格总结,分为开源(对外公开)和闭源(仅限内部),以及公共(全员可访问)和内部(特定团队/项目组)四个维度

以下是公司内部自建知识共享的方式分类、详细步骤及表格总结&#xff0c;分为开源&#xff08;对外公开&#xff09;和闭源&#xff08;仅限内部&#xff09;&#xff0c;以及公共&#xff08;全员可访问&#xff09;和内部&#xff08;特定团队/项目组&#xff09;四个维度&am…

Oracle 19c部署之初始化实例(三)

上一篇文章中&#xff0c;我们已经完成了数据库软件安装&#xff0c;接下来我们需要进行实例初始化工作。 一、初始化实例的两种方式 1.1 图形化初始化实例 描述&#xff1a;图形化初始化实例是通过Oracle的Database Configuration Assistant (DBCA)工具完成的。用户通过一系…

医疗设备预测性维护合规架构:从法规遵循到技术实现的深度解析

在医疗行业数字化转型加速推进的当下&#xff0c;医疗设备预测性维护已成为提升设备可用性、保障医疗安全的核心技术。然而&#xff0c;该技术的有效落地必须建立在严格的合规框架之上。医疗设备直接关乎患者生命健康&#xff0c;其维护过程涉及医疗法规、数据安全、质量管控等…

Openfeign的最佳实践

文章目录 问题引入一、继承的方式1. 建立独立的Moudle服务2. 服务调用方继承jar包中的接口3. 直接注入继承后的接口进行使用 二、抽取的方式1. 建立独立的Moudle服务2.服务调用方依赖注入 问题引入 openfeign接口的实现和服务提供方的controller非常相似&#xff0c;例如&…

Buildroot编译过程中下载源码失败

RK3588编译一下recovery&#xff0c;需要把buildroot源码编译一遍。遇到好几个文件都下载失败&#xff0c;如下所示 pm-utils 1.4.1这个包下载失败&#xff0c;下载地址http://pm-utils.freedesktop.org/releases 解决办法&#xff0c;换个网络用windows浏览器下载后&#xff…

OpenCV 图形API(43)颜色空间转换-----将 BGR 图像转换为 LUV 色彩空间函数BGR2LUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为LUV色彩空间。 该函数将输入图像从BGR色彩空间转换为LUV。B、G和R通道值的传统范围是0到255。 输出图像必须是8位无符…

自问自答模式(Operation是什么)

自问自答 问&#xff1a;Operation 注解来自哪里&#xff1f; 答&#xff1a;Operation 是 OpenAPI&#xff08;Swagger&#xff09;规范中&#xff0c;来自 io.swagger.v3.oas.annotations 包的一个注解&#xff0c;用于给 REST 接口增加文档元数据。 问&#xff1a;summary …

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容 获取 Input 内容测试NPC参考资料获取 Input 内容 测试NPC -- NPC入口函数 function main(player)local msg = [[<Img|id=9527|x=0|y=0|width=300|height=150|img=public/bg_npc_01.png|bg=1|move=1|reset=1|show=0|layer…

少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)

观己之前&#xff0c;也可先观众生 如果当时没有袖手旁观&#xff0c;或许唇不亡齿也不会寒 ■如何轻松/更好应对个别被众人孤立&#xff08;他人、辨别、自己&#xff09; ●他人被孤立 不参与 有余力&#xff0c;助弱者 被孤立者本身有问题 •不参与&#xff1a;不会辨…

leetcode0058. 最后一个单词的长度-easy

1 题目&#xff1a;最后一个单词的长度 官方标定难度&#xff1a;易 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#x…

新一代电子海图S-100标准

随着航海技术的不断发展&#xff0c;国际海事组织&#xff08;IMO&#xff09;和国际航道测量组织&#xff08;IHO&#xff09;不断推动电子海图标准的更新&#xff0c;以提高航行安全和效率。S-100标准作为新一代电子海图标准&#xff0c;为电子海图显示和信息系统&#xff08…

力扣热题100——普通数组(不普通)

普通数组但一点不普通&#xff01; 最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 最大子数组和 这道题是非常经典的适用动态规划解决题目&#xff0c;但同时这里给出两种解法 动态规划、分治法 那么动态规划方法大家可以在我的另外一篇博客总结中看到&am…

深度学习与机器学习的关系解析:从基础到应用

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…