ASP.NET Core 2.0 全局配置项

问题

如何在 ASP.NET Core 2.0 应用程序中读取全局配置项?

答案

首先新建一个空项目,并添加两个配置文件:

1. appsettings.json

{  "Section1": {    "SettingA": "ValueA",    "SettingB": "ValueB"},  "Section2": {    "SettingC": "ValueC"}
}


2. appsettings.Development.json


{  "Section1": {    "SettingA": "Dev_ValueA"},  "Section2": {    "SettingC": "Dev_ValueC"}
}

Visual Studio会自动识别两者的关系,并在解决方案层次结构中展示如下:

然后创建相应的POCO类,分别对应于几个配置节点:


public class AppSettings
{   
 
public AppSettingsSection1 Section1 { get; set; }    public AppSettingsSection2 Section2 { get; set; } }

public class AppSettingsSection1 {  
 
public string SettingA { get; set; }  

 
public string SettingB { get; set; } }

public class AppSettingsSection2 {  
  
public string SettingC { get; set; } }


在Startup.cs文件中,创建接收 IConfiguration 的构造函数:

public static IConfiguration Configuration { get;
private set;}

public Startup(IConfiguration config) {Configuration = config; }

然后在 ConfigureServices() 方法中添加Options服务,并设置依赖项:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(Configuration);
}

最后,将配置项作为IOptions接口注入中间件的构造函数,其中泛型类型T就是我们刚才定义的POCO类:


public class HelloWorldMiddleware
{   

 
private readonly RequestDelegate _next;  
 
private readonly AppSettings _settings;

  
public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options){_next = next;_settings = options.Value;}  

 
public async Task Invoke(HttpContext context){      
    
var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);    
   
await context.Response.WriteAsync(jsonSettings);} }

public static class UseHelloWorldInClassExtensions {  
   
public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder app){      
  
return app.UseMiddleware<HelloWorldMiddleware>();} }

在Startup.cs的 Configure() 方法中,将此中间件注入到请求管道中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.UseHelloWorld();
}

运行,此时页面显示:

讨论

 ASP.NET Core 拥有一个简单的机制来从各种数据源(比如JSON文件,环境变量,甚至是自定义数据源)中读取应用程序设置。然后通过依赖注入,方便的使用这些配置项。

尽管这一切看起来很魔幻(我们的设置究竟是如何加载的!),ASP.NET Core 2.0隐藏了从数据源中读取配置项的细节,这些内容本应该存在于Program.cs文件中WebHost的CreateDefaultBuilder()方法中。IConfiguration随后被添加到服务容器中,并在应用程序的其他部分保持可用,我们使用Startup中的此接口来添加配置项。为了观察这个过程,请将Program.cs文件中的BuildWebHost()方法替换为如下内容,得到的结果是一样的:

public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().ConfigureAppConfiguration((context, builder) =>{            var env = context.HostingEnvironment;builder.AddJsonFile("appsettings.json",optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional: true, reloadOnChange: true);            

if (env.IsDevelopment()){              
 
var appAssembly = Assembly.Load(                    new AssemblyName(env.ApplicationName));      
          
if (appAssembly != null){builder.AddUserSecrets(appAssembly, optional: true);}}builder.AddEnvironmentVariables();            if (args != null){builder.AddCommandLine(args);}}).Build();

在上面的解决方案中,我们提供了两个JSON文件数据源。需要记着的一点是,这些文件按照顺序被依次读取,后面的数据源会覆盖前面的数据源。你也可以在上面的运行结果中注意到,SettingB配置项来自于第一个配置文件,而其他两个配置项都来自于第二个配置文件。

注意:Startup.cs中的IConfiguration实例拥有public static修饰符,因此可以在整个应用程序期间使用此实例:

var valueA = Config["Section1:SettingA"];

然而,更好的办法是将配置项读入一个类型化的POCO类,并将其作为依赖项注入中间件或者控制器。上面的示例正好展示了这个模式。

你也可以为不同的配置节定义不同的POCO类,并使用IConfiguration的GetSection()方法来读取。

 

====start by sanshi=========================

下面我们简单扩展之前的示例,来读取不同的配置节:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(Configuration);services.Configure<AppSettingsSection1>(Configuration.GetSection("Section1"));
}

更新中间件代码,此时向中间件的构造函数注入两个依赖项:


public class HelloWorldMiddleware
{   
 
private readonly RequestDelegate _next;  
 
private readonly AppSettings _settings;    

private readonly AppSettingsSection1 _settingsSection1;  

 
public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options, IOptions<AppSettingsSection1> optionsSection1){_next = next;_settings = options.Value;_settingsSection1 = optionsSection1.Value;}    

public async Task Invoke(HttpContext context){      
 
var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);      
 
var jsonSettingsSection1 = JsonConvert.SerializeObject(_settingsSection1, Formatting.Indented);    
   
await context.Response.WriteAsync("AppSettings:\n" + jsonSettings + "\n\nAppSettings - Section1:\n" + jsonSettingsSection1);} }


运行,此时页面显示:

====end by sanshi=========================

 

当然,我们也可以手工设置配置项的值,通过使用IServiceCollection.Configure的重载方法并接收强类型的lambda表达式:

====start by sanshi=========================

 修改ConfigurationServices()方法,手工设置配置项:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(options =>{options.Section1 = new AppSettingsSection1();options.Section1.SettingA = "SettingA Value";options.Section1.SettingB = "SettingB Value";});
}


运行,此时页面效果:

====end by sanshi========================= 

原文:https://tahirnaushad.com/2017/08/15/asp-net-core-configuration/


原文地址:http://www.cnblogs.com/zhaopei/p/SSO.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

Auto.JS 教程

最近淘宝双十一活动来了&#xff0c;有个自动领猫币的脚本&#xff0c;基于auto.js&#xff0c;亲测有效。有兴趣的点这里 声明&#xff1a; 本教程基于b站up主-笔青居的视频。传送门&#xff1a;https://space.bilibili.com/21486893/video Auto.JS Auto.js 是个基于 JavaScri…

Mybatis的核心配置

学习目标 了解Mybatis核心对象的作用熟悉Mybatis配置文件中各个元素的作用掌握Mybatis映射文件中常用元素的使用 文章目录 1.Mybatis的核心对象 1.1 SqlSessionFactory 1.2 SqlSession 1.2.1 使用工具类创建SqlSession 2. 配置文件 2.1 主要元素 3. 映射文件 2.1主要元素…

jzoj5353-村通网【最小生成树】

正题 题目大意 一条边的价格为两个点的曼哈顿距离乘B&#xff0c;修建源点价格为A。要求每个联通块内都有源点的最小价格。 解题思路 对于最终每个联通块肯定是棵树。对于合并每个联通块可以减少一个源点。所以将最小生成树上价格小于A的边都加进去就可以了。 codecodecode …

auto.js小案例

微信朋友圈自动点赞 var it className("ListView").findOne(); var i1;while(i<5){say desc(评论).findOne();say.click();goodtext(赞).findOne();goodpgood.parent();goodp.click();sleep(1000);it.scrollDown();i; }home();微信轰炸机 toast("轰炸机已准…

本土开源、立足全球 | COSCon'17

全球公有云 90% 的服务器运行的是开源 Linux 操作系统&#xff01; GitHub 上有超过 150 万个组织&#xff0c;正在进行开源开发&#xff01; 本土开源项目目前在 Apache 的顶级以及孵化列表中已经有 6 个&#xff01; 你想知道这其中都有什么奥秘吗&#xff1f;Apache 顶级项目…

Zookeeper选举原理——FastLeaderElection

转载自 Zookeeper选举原理 作为一个分布式应用程序协调服务&#xff0c;在大型网站中&#xff0c;其本身也是集群部署的&#xff0c;安装zookeeper的时候最好是单数节点&#xff0c;因为要选举。Zookeeper的leader节点是集群工作的核心&#xff0c;用来更新并保证leader和ser…

P2742-二维凸包/圈奶牛Fencing the Cows【凸包】

正题 题目链接:https://www.luogu.org/recordnew/lists?uidSSL_WYC_zombieeeeee&pidP2742&status&sort0 题目大意 求凸包总长度 解题思路 求凸包 codecodecode #include<cstdio> #include<algorithm> #include<cmath> #define N 10010 usin…

Wamp升级php到7.3版本

在网上找了关于cms的模板&#xff0c;结果显示php版本低于7.2的无法使用。 找了很多wamp和xampp的安装包&#xff0c;要不然版本没到7.2&#xff0c;要不然安装无法使用&#xff0c;浪费了很多时间 于是想自己手动把php升到7.3版本&#xff0c;刚开始看教程&#xff0c;特别麻烦…

浅析Entity Framework Core中的并发处理

前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处理策略 要了解如何处理并发,就要知道并发的一般处理策略 悲观并发策略 悲观并发策略,正如其名,它指的是对数据被外界&…

Mybatis的关联映射

学习目标 了解数据表之间以及对象之间的三种关联关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一、一对多和多对多关联映射的使用文章目录 1. 关联关系概述 2. 一对一 3.一对多 4. 多对多 1. 关联关系概述 一对一的关系&#xff1a;就是在本类中定义对方类型的对象一对…

POJ3348-Cows【凸包,计算几何】

正题 题目大意 凸包的面积S&#xff0c;求⌊S/50⌋\left \lfloor S/50\right \rfloor⌊S/50⌋ 解题思路 求凸包&#xff0c;然后求面积&#xff0c;然后求答案。 codecodecode #include<cstdio> #include<algorithm> #include<cmath> #define N 10010 usi…

【乱码】字符串乱码

1、html <meta charset"UTF-8">2、mysql mysql_query(set names "utf8");3、php header("Content-Type: application/json;charsetUTF-8");json解码 $a你好; echo json_encode($a);加入 $aurldecode($a);即可解码

.NET Core 使用RSA算法 加密/解密/签名/验证签名

前言 前不久移植了支付宝官方的SDK&#xff0c;以适用ASP.NET Core使用支付宝支付&#xff0c;但是最近有好几位用户反应在Linux下使用会出错&#xff0c;调试发现是RSA加密的错误&#xff0c;下面具体讲一讲。 RSA在.NET Core的改动 以前我们使用RSA加密主要是使用RSACryptoSe…

C++描述杭电OJ 2012.素数判定 ||

C描述杭电OJ 2012.素数判定 || Problem Description 对于表达式n^2n41&#xff0c;当n在&#xff08;x,y&#xff09;范围内取整数值时&#xff08;包括x,y&#xff09;(-39<x<y<50)&#xff0c;判定该表达式的值是否都为素数。 Input 输入数据有多组&#xff0c;…

ajax读取.txt文件出现乱码

其实挺简单一问题&#xff0c;刚开始以为页面没输入 <meta charset"UTF-8">结果还是乱码&#xff0c;后来想到老师讲过&#xff0c;新建文件时保存文件有utf8和ANSI等格式&#xff0c;一看果然不对&#xff0c;自己每次新建文件默认格式都是ANSI&#xff0c;这…

P3369-[模板]普通平衡树【有旋Treap】

正题 评测记录:https://www.luogu.org/recordnew/lists?uidSSL_WYC_zombieeeeee&pidP3369&status&sort0 题目大意 要求支持查询一个数字的排名&#xff0c;查询该排名的数字&#xff0c;插入数字&#xff0c;删除数字&#xff0c;求前驱后继。 解题思路 有旋Tr…

ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

本博文翻译自&#xff1a; https://dotnetcoretutorials.com/2017/10/11/owasp-top-10-asp-net-core-sql-injection/ OWASP或者说是开放Web应用程序安全项目&#xff0c;这是一个非营利性的组织&#xff0c;其目的是促进安全的web应用程序的开发和设计。当他们在世界各地举办不…

C++描述杭电OJ 2023.求平均成绩 ||

C描述杭电OJ 2023.求平均成绩 || Problem Description 假设一个班有n(n<50)个学生&#xff0c;每人考m(m<5)门课&#xff0c;求每个学生的平均成绩和每门课的平均成绩&#xff0c;并输出各科成绩均大于等于平均成绩的学生数量。 Input 输入数据有多个测试实例&#x…

adb操作

adb下载安装 链接&#xff1a;https://pan.baidu.com/s/1Tg_q7Q5wS-0-y_3KuZL-dQ 提取码&#xff1a;599i 检验是否连接到手机 adb devices 检测是否自己的手机 adb shell wm size 无线连接: 先开启usb连接调试 连接手机ip adb connect 192.168.1.5 连接成功后可拔掉usb继续测…

P3369-[模板]普通平衡树【替罪羊树】

正题 评测记录:https://www.luogu.org/recordnew/lists?uidSSL_WYC_zombieeeeee&pidP3369&status&sort0 题目大意 要求支持查询一个数字的排名&#xff0c;查询该排名的数字&#xff0c;插入数字&#xff0c;删除数字&#xff0c;求前驱后继。 解题思路 替罪羊…