定制ASP.NET 6.0的应用配置
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。
本文的主题是应用程序配置。要介绍的是如何使用配置、如何自定义配置,以采用不同的方式配置。也许您已经有了现有的XML配置,或者希望在不同的应用上共享YAML配置文件,或者从数据库中读取配置值,总之,配置是我们绕不开的话题。
本文,我们将讨论以下主题:
- 设置配置文件
- 使用类型化配置
- 使用初始化(INI)文件进行配置
- 配置提供程序
本文中的主题仍然是处在ASP.NET Core
的Host
层:
2.1设置配置文件
让我们从各种配置选项开始,自ASP.NET Core2.0
,为了确保Startup.cs
的干净和简单,配置被隐藏在WebHostBuilder
的默认配置中,不再是Startup.cs
的一部分。
在ASP.NET Core3.1到ASP.NET Core 5.0
,代码如下所示:
public class Program {
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).
ConfigureWebHostDefaults(webBuilder =>{
webBuilder.UseStartup();
}
}
在ASP.NET Core 6.0
中,为了进一步的简化,Microsoft
引入了最小应用程序编程接口(API)方法:去除Startup.cs
文件,把所有的配置放在在Program.cs
文件中,让我们看看是什么样子:
Var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
上面两个版本都自带默认配置,也支持自定义配置。我们可以使用ConfigureAppConfiguration()
方法扩展了IWebHostBuilder
。
下面是ASP.NET Core3.1到ASP.NET Core 5.0中的
使用最小API方法时的定制代码:
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((builderContext,config) =>
{
//这里是配置内容
}).UseStartup();
});
您还可以使用ConfigureAppConfiguration
来配置应用程序配置:
builder.WebHost.ConfigureAppConfiguration((builderContext, config) =>
{
//这里是配置内容
});
还有一种更简单的方法,通过访问builder
的Configuration
属性:
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange: true);
当我们创建ASP.NET Core
项目,会生成一些默认的配置文件,比如appsettings.json
和appsettings.Development.json
,大多数ASP.NET Core
开发人员会使用默认的配置文件来配置。
以下展示了一段用于读取appsettings.json
的默认代码:
var env = builder.Environment;
builder.Configuration.SetBasePath(env.ContentRootPath);
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange:true);
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true);
builder.Configuration.AddEnvironmentVariables();
该配置通过环境变量设置了应用程序的基本路径,这里使用AddEnvironmentVariables()
配置方法是一种最佳实践。另外,配置顺序也很重要,后添加的配置将覆盖之前添加的配置,这里的环境变量始终做最后的覆盖。
IConfigurationBuilder
有很多扩展方法可以添加更多配置,例如XML或INI配置文件和内存配置,甚至您也可以在社区了找到的其他配置提供程序,以读取YAML文件、数据库值等。
2.2 使用类型化配置
在尝试读取INI
文件之前,有必要了解如何使用类型化配置,而不是通过IConfiguration
逐键读取配置。要读取类型化配置,需要定义待配置的类型。假设我们创建一个名为AppSettings
的类,如下所示:
namespace ConfigureSample;
public class AppSettings {
public int Foo { get; set; }
public string Bar { get; set; }
}
这是一个简单的POCO类,然后,我们可以在Startup.cs
的ConfigureServices
方法内填充这些类。直到ASP。NET Core 5.0:
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
使用迷你API(minimal API
)方法,配置如下所示:
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
这样,类型化配置也可以在依赖注入(DI)容器中注册为服务,并且可以在应用程序中的任何地方使用。您可以为每个配置创建不同的配置类型。在大多数情况下,一个配置足以应对,但有时为了需要会将配置划分为不同的配置。
下面的代码演示了如何在MVC控制器中使用类型配置:
using Microsoft.Extensions.Options;
// ...
public class HomeController : Controller {
private readonly AppSettings _options;
public HomeController(IOptions<AppSettings> options)
{
_options = options.Value;
}
public IActionResult Index()
{
ViewData["Message"] = _options.Bar;
return View();
}
}
IOptions
是AppSettings
类型的包装器,Value
属性包含AppSettings
类的实例,包括配置文件中的值。
要读取设置,需要先在appsettings.json
文件中配置AppSettings
部分,否则值将为null
或未设置。现在,让我们将该部分添加到appsettings.json
文件,如下所示:
{
"Logging": { "LogLevel": { "Default": "Warning" }},
"AllowedHosts": "*",
"AppSettings": {"Foo": 123,"Bar": "Bar"}
}
2.3 使用INI文件进行配置
要使用INI
文件来配置应用程序,您需要在Program.cs
的ConfigureAppConfiguration()
方法中添加INI
配置,如下所示:
builder.Configuration.AddIniFile("appsettings.ini",optional: false,reloadOnChange: true);
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.ini", optional: true, reloadOnChange: true);
此代码以与JSON
配置文件加载方式相同。第一行是必需的配置,第二行是可选的配置,具体取决于当前运行时环境。
INI文件可能如下所示:
[AppSettings] Bar="FooBar"
此文件包含一个名为AppSettings
和一个名为Bar
的属性。
前面我们说过,配置的顺序很重要。如果通过JSON
文件进行配置之后再添加两行有关INI
文件的配置,INI
文件将覆盖JSON
文件中的设置,Bar
属性值将被FooBar
覆盖。此外,INI
文件中的值将通过之前创建的类型化配置提供。
其他所有配置提供程序都将以相同的机制工作。
2.4 配置提供程序
配置提供程序是IConfigurationProvider
的实现,它是由配置源创建的(配置源是IConfigurationSource
的实现)。配置提供程序从配置源头读取数据,并通过字典对外提供数据。
将自定义或第三方配置提供程序添加到ASP.NET Core
中,您需要调用ConfigurationBuilder
上的Add
方法添加配置源:
// add new configuration source
builder.Configuration.Add(new MyCustomConfigurationSource {
SourceConfig = //配置数据来源
Optional = false,
ReloadOnChange = true
});
通常,我们会创建一个扩展方法来更优雅地添加配置源,如下所示:
builder.Configuration.AddMyCustomSource("source", optional: false, reloadOnChange: true);
2.4 回顾
其实在大多数情况下,我们不需要添加其他配置提供程序或创建自己的配置提供程序,但是为了以防万一,但最好知道如何定制它。此外,使用类型化配置是读取和提供设置的好方法。在经典的ASP.NET
中,我们往往使用手动的方式读取配置,现在,我们只需提供一个类型即可自动完成此操作,因为该类型将通过DI自动实例化。
定制ASP.NET 6.0的应用配置的更多相关文章
- Asp.net Core3.0 跨域配置
原文:http://www.zilaohu.cn/Jie/Detail_Jie?ID=78840a04-55b8-4988-80b2-f964fd822d63 下面配置后:被拒绝的域请求后,可以进入方 ...
- 403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
问题1: 发布mvc3报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...
- iis7 发布mvc3 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
问题1: 发布mvc3报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...
- SNF快速开发平台3.0之-界面个性化配置+10种皮肤+7种菜单-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
一.个性配置-首页:可以进行拖动保存配置,下次登录时就会按配置的进行加载 二.个人配置页面 7种菜单用户可自定义配置,和预览效果 10种皮肤自定义配置,和预览效果 皮肤和菜单可以随意组合-部分截图: ...
- [转载]ASP.NET伪静态页面的实现和伪静态在IIS7.0中的配置
ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置 最近在写一个CMS的内容管理系统,需要用到一个伪静态方面的方法,在网上找了一下这方面的资料,现将这方面的资源记录一下. 本机环境: ...
- 【转】如何在ASP.NET 2.0中定制Expression Builders
expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 在ASPX页里只要使用$符号就可以访问到,你定制的属性了. 例如我们看个例子: ...
- ASP.NET AjaxControlToolkit-Framework4.0 配置实用(简单介绍CalendarExtender日期控件)
1:下载:AjaxControlToolkit Ajax Control Toolkit .NET 4 Ajax Control Toolkit .NET 4.5 Ajax Control Toolk ...
- 玩转ASP.NET 6.0框架-序言
ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能. 本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架.本专栏提供 ...
- Log4Net异常日志记录在asp.net mvc3.0的应用
前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...
随机推荐
- 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...
- C# 委托专题
单播委托:一个委托只指向一个方法: 多播委托:一个委托指向多个方法,形成一个方法链: Main是静态方法,里面只能引用静态方法,而不能引用实例方法: Main可以进行类的实例化,然后引用实例化后的方法 ...
- h5页面跳转小程序
2020年以前, 只能通过 web-view内嵌h5跳转小程序,现在 可以直接跳了!!!!!! 官方文档:https://developers.weixin.qq.com/doc/offiacco ...
- thymeleaf的具体语法
thymeleaf模板引擎是什么?请点击我查看 文章目录 thymeleaf模板引擎是什么?请点击我查看 代码 该实例代码延续[thymeleaf模板引擎](https://blog.csdn.net ...
- petite-vue源码剖析-逐行解读@vue-reactivity之Map和Set的reactive
本篇我们会继续探索reactive函数中对Map/WeakMap/Set/WeakSet对象的代理实现. Map/WeakMap/Set/WeakSet的操作 由于WeakMap和WeakSet分别是 ...
- SMTP协议解读以及如何使用SMTP协议发送电子邮件
电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件.SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名. 相较于POP3而言 ...
- 音视频基本概念和FFmpeg的简单入门
写在前面 最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下: 基本概念 容器/文件(Conainer/File): 即特定格式的多媒体文件,一般来说一个视 ...
- XCTF练习题---MISC---Hidden-Message
XCTF练习题---MISC---Hidden-Message flag:Heisenberg 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一个数据包格式,打开看一下 3.查看UDP流,并 ...
- MySQL索引分类及相关概念辨析
本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇<MySQL索引底层数据结构及原理深入分析>很受读者欢迎,成功地帮大家揭 ...
- victoriaMetrics中的一些Sao操作
victoriaMetrics中的一些Sao操作 快速获取当前时间 victoriaMetrics中有一个fasttime库,用于快速获取当前的Unix时间,实现其实挺简单,就是在后台使用一个goro ...