asp.net core 系列 11 配置configuration (下)

来源:https://www.cnblogs.com/MrHSR/archive/2019/01/18/10285906.html
-Advertisement-
Play Games

四. 文件配置提供程式AddIniFile、 AddXmlFile、AddJsonFile FileConfigurationProvider 是從文件系統載入配置的基類。 以下配置提供程式專用於特定文件類型: (1) INI 配置提供程式 IniConfigurationProvider: Fil ...


四. 文件配置提供程式AddIniFile、 AddXmlFile、AddJsonFile

  FileConfigurationProvider 是從文件系統載入配置的基類。 以下配置提供程式專用於特定文件類型:

    (1) INI 配置提供程式 IniConfigurationProvider: FileConfigurationProvider

    (2) JSON 配置提供程式 JsonConfigurationProvider: FileConfigurationProvider

    (3) XML 配置提供程式 XmlConfigurationProvider: FileConfigurationProvider

 

  4.1  INI 配置提供程式

    IniConfigurationProvider 在運行時從 INI 文件鍵值對載入配置,若要激活 INI 文件配置,請在 ConfigurationBuilder 的實例上調用 AddIniFile 擴展方法。冒號可用作 INI 文件配置中的節分隔符。下麵是一個ini配置文件通用示例:

    [section0]
    key0=value
    key1=value

    [section1]
    subsection:key=value

    [section2:subsection0]
    key=value

    [section2:subsection1]
    key=value
//下麵是獲取各節點中的value值,需要載入的鍵。
    section0:key0
    section0:key1
    section1:subsection:key
    section2:subsection0:key
    section2:subsection1:key

    下麵示例是使用config.AddIniFile方法載入一個config.ini文件,該方法重載允許指定:(1) optional文件是否可選,(2)reloadOnChange如果文件更改,是否重載配置。IFileProvider只讀該文件。

    config.SetBasePath(Directory.GetCurrentDirectory());
    config.AddIniFile("config.ini", optional: true, reloadOnChange: true);
    //OtherPages/Page1頁面訪問,val 值value
     string val=  Configuration.GetSection("section0").GetSection("key0").Value;

 

  4.2 JSON 配置提供程式

    JsonConfigurationProvider 在運行時期間從 JSON 文件鍵值對載入配置。若要激活 JSON 文件配置,請在 ConfigurationBuilder 的實例上調用 AddJsonFile 擴展方法。下麵是使用config. AddJsonFile方法載入一個config.json文件,具體格式可參考appsettings.json

      config.SetBasePath(Directory.GetCurrentDirectory());
      config.AddJsonFile("config.json", optional: true, reloadOnChange: true);

    效果就不再具體演示,重點講下註意事項:使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,會自動調用 AddJsonFile 兩次。 調用該方法來從以下文件載入配置:(1)appsettings.json – 首先讀取此文件。(2) appsettings.{Environment}.json。也就是說調用二次AddJsonFile後,AddJsonFile才會調用上面顯示指定的config.json.

 

  4.3 XML 配置提供程式

    XmlConfigurationProvider 在運行時從 XML 文件鍵值對載入配置。若要激活 XML 文件配置,請在 ConfigurationBuilder 的實例上調用 AddXmlFile 擴展方法。XML文件創建配置鍵值對時,將忽略配置文件的根節點。 不要在文件中指定文檔類型定義 (DTD) 或命名空間。

    config.SetBasePath(Directory.GetCurrentDirectory());
    config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);

    (1)下麵是一個xml配置文件通用示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <section0>
        <key0>value</key0>
        <key1>value</key1>
      </section0>
      <section1>
        <key0>value</key0>
        <key1>value</key1>
      </section1>
    </configuration>
//下麵是獲取各節點中的value值,需要載入的鍵。 section0:key0 section0:key1 section1:key0 section1:key1

    (2) 如果使用 name 屬性來區分元素,則使用相同元素名稱的重覆元素可以正常工作:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <section name="section0">
        <key name="key0">value</key>
        <key name="key1">value</key>
      </section>
      <section name="section1">
        <key name="key0">value</key>
        <key name="key1">value</key>
      </section>
    </configuration>

    //下麵是獲取各節點中的value值,需要載入的鍵。
    section:section0:key:key0
    section:section0:key:key1
    section:section1:key:key0
    section:section1:key:key1

    (3) 屬性可用於提供值

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <key attribute="value" />
      <section>
        <key attribute="value" />
      </section>
    </configuration>

    //下麵是獲取各屬性中的value值,需要載入的鍵。
    key:attribute
    section:key:attribute

 

五. Key-per-file 配置提供程式 AddKeyPerFile

  KeyPerFileConfigurationProvider 使用目錄的文件作為配置鍵值對。 該鍵是文件名。 該值包含文件的內容。 Key-per-file 配置提供程式用於 Docker 托管方案。若要激活 Key-per-file 配置,請在 ConfigurationBuilder 的實例上調用 AddKeyPerFile 擴展方法。 文件的 directoryPath 必須是絕對路徑。

  下麵示例是使用config.AddKeyPerFile方法載入一個目錄文件,在使用Docker 托管時具體參考官方文檔。

       config.SetBasePath(Directory.GetCurrentDirectory());
       var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");
        config.AddKeyPerFile(directoryPath: path, optional: true);

 

 六. 記憶體配置提供程式AddInMemoryCollection

   MemoryConfigurationProvider 使用記憶體中集合作為配置鍵值對。若要激活記憶體中集合配置,請在 ConfigurationBuilder 的實例上調用 AddInMemoryCollection 擴展方法。

       /// <summary>
        /// 構建記憶體對象的鍵值對
        /// </summary>
        public static readonly Dictionary<string, string> _dict =
         new Dictionary<string, string>
        {
            {"MemoryCollectionKey1", "value1"},
            {"MemoryCollectionKey2", "value2"}
        };

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
       .ConfigureAppConfiguration((hostingContext, config) =>
       {
           config.AddInMemoryCollection(_dict);
       })
       .UseStartup<Startup>();
    //OtherPages/Page1頁面訪問,val 值value
    string val=Configuration.GetSection("MemoryCollectionKey1").Value

 

七. 讀取GetValue、GetSection、GetChildren 和 Exists

  7.1 GetValue

     ConfigurationBinder.GetValue<T> 從具有指定鍵的配置中提取一個值,並將其轉換為指定類型。 如果未找到該鍵,則重載允許你提供預設值。以下示例使用鍵 NumberKey 從配置中提取字元串值,鍵入該值作為 int,並將值存儲在變數 intValue 中。 如果在配置鍵中找不到 NumberKey,則 intValue 會接收 99 的預設值。

    var intValue = config.GetValue<int>("NumberKey", 99);

  7.2 GetSection

    IConfiguration.GetSection 使用指定的子節鍵提取配置子節。GetSection 永遠不會返回 null。 如果找不到匹配的節,則返回空 IConfigurationSection。

 { 
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  },
  "section2": {
    "subsection0" : {
      "key0": "value",
      "key1": "value"
    },
    "subsection1" : {
      "key0": "value",
      "key1": "value"
    }
  }
}
    //返回僅包含 section1 中鍵值對的 IConfigurationSection 對象
    var configSection = _config.GetSection("section1");

    //獲取 section2:subsection0 中鍵的值
    var configSection = _config.GetSection("section2:subsection0");

  7.3 GetChildren

    //在上面的json結構中,獲取section2下麵的子節點
    var configSection = _config.GetSection("section2");

    var children = configSection.GetChildren();

  7.4 Exists

  //在上面的json結構中,確定配置節是否存在, 為false,是因為配置數據中沒有 section2:subsection2 節點
  var sectionExists = _config.GetSection("section2:subsection2").Exists();

 

八. 綁定到類

   使用GetSection方法調用 Bind 可以構造 POCO 對象。POCO就是簡單CLR對象(Plain Old CLR Object),這種類不繼承於任何對象(或者說直接繼承於Object),示例應用包含 Starship 模型 (Models/Starship.cs)。

     config.SetBasePath(Directory.GetCurrentDirectory());
     config.AddJsonFile("starship.json",false,true);

  Starship實體對應JSON的 starship 節點

  {
    "starship": {
      "name": "USS Enterprise",
      "registry": "NCC-1701",
      "class": "Constitution",
      "length": 304.8,
      "commissioned": false
    },
    "trademark": "Paramount Pictures Corp. http://www.paramount.com"
  }
   // OtherPages/Page1頁面綁定starship 節點到Starship實體中
       var starship = new Models.Starship();
       Configuration.GetSection("starship").Bind(starship);

 

  總結:

    Configuration配置的其它知識點如:將數組綁定至類、自定義配置提供程式、在啟動期間訪問配置、在 Razor Pages 頁或 MVC 視圖中訪問配置等等, 請參考官方文檔。

    在Configuration配置的上下二篇中,講到了Configuration對不同配置來源的載入和讀取方法,Microsoft.Extensions.Configuration.IConfiguration中全是以Get開頭的只讀方法,並沒有涉及到對配置來源(如json或xml文件)的增刪改操作。像配置的xml文件,是否需要引入System.Xml.Linq來操作xml文件的增刪改操呢?帶著這個疑問在以後章節再瞭解。

 

參考文獻

官方資料:asp.net core 配置

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本教程會對基本的.Net Core 進行一個大概的且不會太深入的講解, 在您看完本系列之後, 能基本甚至熟練的使用.Net Core進行Web開發, 感受到.Net Core的魅力. 本教程知識點大體分為以下幾個階段 ASP.Net Core MVC基礎知識 SqlSugar ORM (進行資料庫交 ...
  • --創建存儲過程create proc usp_userInfo@pageSize int=7,--每頁顯示條數@pageIndex int=1,--每頁顯示頁數@pageCount int output ,--顯示總的條數@recodNumber int output--顯示總的頁數asbegin ...
  • 很多小伙伴都用過Lambda表達式和linq表達式,用起來也得心應手,但是有的小伙伴 對匿名對象的查詢與接收比較迷茫,(沒有定義相應的實體),怎麼在where()裡面進行 條件篩選呢?常規用法我就不說了,我們來說一下匿名對象怎麼操作。 我們先看一下Lambda表達式的形式: 然後用過Dictiona ...
  • demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安裝部署 ElasticSearch 請參考上一篇文章 "Windows 10 安裝 ElasticSear ...
  • 本教程會對基本的.Net Core 進行一個大概的且不會太深入的講解, 在您看完本系列之後, 能基本甚至熟練的使用.Net Core進行Web開發, 感受到.Net Core的魅力. 本教程知識點大體分為以下幾個階段 ASP.Net Core MVC基礎知識 SqlSugar ORM (進行資料庫交 ...
  • HtmlAgilityPack簡介 HtmlAgilityPack是一個開源的解析HTML元素的類庫,最大的特點是可以通過XPath來解析HMTL,如果您以前用C#操作過XML,那麼使用起HtmlAgilityPack也會得心應手。目前版本更新的是非常的快,最新更新時間還是19年的呢! XPath介 ...
  • 1.獲取ip和埠 string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + Request.HttpContext.Connection.LocalPort); 輸出str, ...
  • C# -- 使用 DriveInfo 獲取磁碟驅動器信息 1. 代碼實現 2. 運行結果: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...