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

文章目錄

  • 前言
  • 一、配置源與默認設置
  • 二、使用步驟
    • 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.pswp.cn/diannao/79303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79303.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在生信分析中,從生物學數據庫中下載的序列存放在哪里?要不要建立一個小型數據庫,或者存放在Gitee上?

李升偉 整理 在Galaxy平臺中使用時&#xff0c;從NCBI等生物學數據庫下載的DNA序列的存儲位置和管理方式需要根據具體的工作流程和需求進行調整。以下是詳細的分步說明和建議&#xff1a; 一、Galaxy中DNA序列的默認存儲位置 在Galaxy的“歷史記錄”&#xff08;History&…

SDK游戲盾如何接入?復雜嗎?

接入SDK游戲盾&#xff08;通常指游戲安全防護類SDK&#xff0c;如防DDoS攻擊、防作弊、防外掛等功能&#xff09;的流程和復雜度取決于具體的服務商&#xff08;如騰訊云、上海云盾等&#xff09;以及游戲類型和技術架構。以下是一般性的接入步驟、復雜度評估及注意事項&#…

通過類似數據蒸餾或主動學習采樣的方法,更加高效地學習良品數據分布

好的&#xff0c;我們先聚焦第一個突破點&#xff1a; 通過類似數據蒸餾或主動學習采樣的方法&#xff0c;更加高效地學習良品數據分布。 這里我提供一個完整的代碼示例&#xff1a; ? Masked圖像重建 殘差熱力圖 這屬于自監督蒸餾方法的一個變體&#xff1a; 使用一個 預…

【課題推薦】多速率自適應卡爾曼濾波(MRAKF)用于目標跟蹤

多速率自適應卡爾曼濾波(Multi-Rate Adaptive Kalman Filter, MRAKF)是一種針對多傳感器異步數據融合的濾波算法,適用于傳感器采樣率不同、噪聲特性時變的目標跟蹤場景。本文給出一個多速率自適應卡爾曼濾波框架,以無人機跟蹤場景為例,融合IMU和GPS數據 文章目錄 背景多速…

軟考 系統架構設計師系列知識點之雜項集萃(49)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;48&#xff09; 第76題 某文件管理系統在磁盤上建立了位視圖&#xff08;bitmap&#xff09;&#xff0c;記錄磁盤的使用情況。若磁盤上物理塊的編號依次為&#xff1a;0、1、2、……&#xff1b…

HTTP:七.HTTP緩存

HTTP緩存介紹 HTTP緩存是一種通過存儲網絡資源的副本,以減少對原始服務器請求的技術。當客戶端再次請求相同資源時,如果該資源未過期,服務器可以直接從本地緩存中提供響應,而無需再次從原始服務器獲取。這大大減少了網絡延遲,提高了加載速度,并減輕了服務器的負載。HTTP…

WPF 圖標原地旋轉

如何使元素原地旋轉 - WPF .NET Framework | Microsoft Learn <ButtonRenderTransformOrigin"0.5,0.5"HorizontalAlignment"Left">Hello,World<Button.RenderTransform><RotateTransform x:Name"MyAnimatedTransform" Angle"…

NO.91十六屆藍橋杯備戰|圖論基礎-圖的存儲和遍歷|鄰接矩陣|vector|鏈式前向星(C++)

圖的基本概念 圖的定義 圖G是由頂點集V和邊集E組成&#xff0c;記為G (V, E)&#xff0c;其中V(G)表?圖G中頂點的有限?空集&#xff1b;E(G)表?圖G中頂點之間的關系&#xff08;邊&#xff09;集合。若 V { v 1 , v 2 , … , v n } V \left\{ v_{1},v_{2},\dots,v_{n} …

【項目日記(一)】-仿mudou庫one thread oneloop式并發服務器實現

1、模型框架 客戶端處理思想&#xff1a;事件驅動模式 事件驅動處理模式&#xff1a;誰觸發了我就去處理誰。 &#xff08; 如何知道觸發了&#xff09;技術支撐點&#xff1a;I/O的多路復用 &#xff08;多路轉接技術&#xff09; 1、單Reactor單線程&#xff1a;在單個線程…

Go語言實現OAuth 2.0認證服務器

文章目錄 1. 項目概述1.1 OAuth2 流程 2. OAuth 2.0 Storage接口解析2.1 基礎方法2.2 客戶端管理相關方法2.3 授權碼相關方法2.4 訪問令牌相關方法2.5 刷新令牌相關方法 2.6 方法調用時序2.7 關鍵注意點3. MySQL存儲實現原理3.1 數據庫設計3.2 核心實現 4. OAuth 2.0授權碼流程…

結合 Python 與 MySQL 構建你的 GenBI Agent_基于 MCP Server

寫在前面 商業智能(BI)正在經歷一場由大型語言模型(LLM)驅動的深刻變革。傳統的 BI 工具通常需要用戶學習復雜的界面或查詢語言,而生成式商業智能 (Generative BI, GenBI) 則旨在讓用戶通過自然語言與數據交互,提出問題,并獲得由 AI 生成的數據洞察、可視化建議甚至完整…

Linux中常用命令

目錄 1. linux目錄結構 2. linux基本命令操作 2.1 目錄操作命令 2.2 文件操作命令 2.3 查看登錄用戶命名 2.4 文件內容查看命令 2.5 系統管理類命令 3. bash通配符 4. 壓縮與解壓縮命令 4.1 壓縮和解壓縮 4.2 測試網絡連通性命令 ping 4.3 vi編輯器 4.4 管道操作(…

C++ 與 MySQL 數據庫優化實戰:破解性能瓶頸,提升應用效率

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

tcp特點+TCP的狀態轉換圖+time_wait詳解

tcp特點TCP的狀態轉換圖time wait詳解 目錄 一、tcp特點解釋 1.1 面向連接 1.1.1 連接建立——三次握手 1.1.2 連接釋放——四次揮手 1.2 可靠的 1.2.1 應答確認 1.2.2 超時重傳 1.2.3 亂序重排 1.2.4 去重 1.2.5 滑動窗口進行流量控制 1.3 流失服務&#xff08;字節…

探秘 Ruby 與 JavaScript:動態語言的多面風采

1 語法特性對比&#xff1a;簡潔與靈活 1.1 Ruby 的語法優雅 Ruby 的語法設計旨在讓代碼讀起來像自然語言一樣流暢。它擁有簡潔而富有表現力的語法結構&#xff0c;例如代碼塊、符號等。 以下是一個使用 Ruby 進行數組操作的簡單示例&#xff1a; # 定義一個數組 numbers [1…

點評項目回顧

表結構 基于Session實現登錄流程 發送驗證碼&#xff1a; 用戶在提交手機號后&#xff0c;會校驗手機號是否合法&#xff0c;如果不合法&#xff0c;則要求用戶重新輸入手機號 如果手機號合法&#xff0c;后臺此時生成對應的驗證碼&#xff0c;同時將驗證碼進行保存&#xf…

OpenShift介紹,跟 Kubernetes ,Docker關系

1. OpenShift 簡介 OpenShift是一個開源項目,基于主流的容器技術Docker及容器編排引擎Kubernetes構建。可以基于OpenShift構建屬于自己的容器云平臺。OpenShift的開源社區版本叫OpenShift Origin,現在叫OKD。 OpenShift 項目主頁:https://www.okd.io/。OpenShift GitHub倉庫…

Ubuntu服務器性能調優指南:從基礎工具到系統穩定性提升

一、性能監控工具的三維應用 1.1 監控矩陣構建 通過組合工具搭建立體監控體系&#xff1a; # 實時進程監控 htop --sort-keyPERCENT_CPU# 存儲性能采集 iostat -dx 2# 內存分析組合拳 vmstat -SM 1 | awk NR>2 {print "Active:"$5"MB Swpd:"$3"…

計算機視覺——基于MediaPipe實現人體姿態估計與不良動作檢測

概述 正確的身體姿勢是個人整體健康的關鍵。然而&#xff0c;保持正確的身體姿勢可能會很困難&#xff0c;因為我們常常會忘記。本博客文章將逐步指導您構建一個解決方案。最近&#xff0c;我們使用 MediaPipe POSE 進行身體姿勢檢測&#xff0c;效果非常好&#xff01; 一、…

LSTM結合LightGBM高緯時序預測

1. LSTM 時間序列預測 LSTM 是 RNN&#xff08;Recurrent Neural Network&#xff09;的一種變體&#xff0c;它解決了普通 RNN 訓練時的梯度消失和梯度爆炸問題&#xff0c;適用于長期依賴的時間序列建模。 LSTM 結構 LSTM 由 輸入門&#xff08;Input Gate&#xff09;、遺…