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

四. 文件配置提供程序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 配置

原文地址:https://www.cnblogs.com/MrHSR/p/10285906.html

时间: 2024-08-13 20:22:41

asp.net core 系列 11 配置configuration (下)的相关文章

asp.net core系列 51 Identity 授权(下)

1.6 基于资源的授权 前面二篇中,熟悉了五种授权方式(对于上篇讲的策略授权,还有IAuthorizationPolicyProvider的自定义授权策略提供程序没有讲,后面再补充).本篇讲的授权方式不是一种全新的授权方式,而是授权应用场景的灵活控制. 基于资源的授权是控制在 razor pages处理程序或mvc的action之中.资源:比如作者发表的文章,只有该作者才能更新文章,文章在进行授权评估之前,必须从数据存储中检索文章. (1) 引用 IAuthorizationService 授权

asp.net core 系列 16 Web主机 IWebHostBuilder

原文:asp.net core 系列 16 Web主机 IWebHostBuilder 一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适用于托管 Web 应用:通用主机(ASP.NET Core 2.1 或更高版本)是适用于托管非 Web 应用:在未来的版本中,通用主机将适用于托管任何类型的应用,包括 Web 应用. 通用主机最终将取代 Web

asp.net core 系列 14 错误处理

一.概述 本文介绍处理 ASP.NET Core 应用中常见错误的一些方法.主要是关于:开发环境异常页:非开发环境配置自定义异常处理页:配置状态代码页(没有正文响应,http状态400~599的). 1.1 开发环境异常页 要将应用配置为显示有关异常的详细信息的页面,请使用开发环境异常页.要环境设置为 Development,具体查看:asp.net core系列9环境.下面向 Startup.Configure 方法添加代码行: if (env.IsDevelopment()) { //注意:

asp.net core 系列 8 Razor框架路由(下)

三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. 配置页面路由AddPageRoute 使用 AddPageRoute 配置路由,该路由与指定页面关联, 使用指定的路由生成页面链接. AddPageRoute 使用 AddPageRouteModelConvention 建立路由. 示例应用为 Privacy.cshtml 创建指向 /ThePrivacy

asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

原文:asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型) 一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent API为属性配置支持字段. 1.1 约定 public class Blog { // _<camel-cased property name> private string _url; public int

asp.net core 系列 15 中间件

原文:asp.net core 系列 15 中间件 一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件. 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作. 请求委托用于生成请求管道. 请求委托会处理每个 HTTP 请求.使用以下方法配置请求委托:Run,  Map, Use扩展方法.可以将单个请求委托作为匿名方法(称为内联中间件in-line middleware) 或者可以在可重用类中定义.这些可重用的类和内联

System Center 2012 R2 CM系列之配置configuration manager防火墙设置

为了能够正常推送Configuration Manager 2012 R2客户端,必须添加防火墙例外设置,主要包括以下两个:A:文件和打印共享:B: Windows Management Instrumentation (WMI) 1. 打开并登录"BJ-DC-01"服务器,点击工具,打开组策略管理器 2. 右键相关域,点击创建"在这个域中创建GPO并在此处链接" 3. 新建GPO对话框中输入相应的GPO名称 4. 右键新创建的PGO,点击编辑,并打开组策略管理编辑

ASP.NET Core 中的配置

前言 配置在我们开发过程中必不可少,ASP.NET中的配置在 Web.config 中.也可配置在如:JSON.XML.数据库等(但ASP.NET并没提供相应的模块和方法). 在ASP.NET Core中Web.config已经不存在了(但如果托管到 IIS 的时候可以使用 web.config 配置 IIS), 而是用appsettings.json和appsettings.(Development.Staging.Production).json配置文件 (可以理解为ASP.NET中的Web

asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

原文:asp.net core 系列 22 EF(连接字符串,连接复原,DbContext) 一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json.用户机密存储.其他配置源中. 下面示例演示appsettings.json 中存储的连接字符串,这样不管asp.net core在什么环境(Development.Staging .Production)