《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)
第 3 章 ASP.NET Core 核心特性
3.5 配置
要访问配置,需要使用 ConfigurationBinder 类,它实现了 IConfigurationBuilder 接口,该接口包括两个重要的方法:
public interface IConfigurationBuilder
{
// 添加不同形式的配置源
IConfigurationBuilder Add(IConfigurationSource source);
// 把所有添加的配置源中的配置信息构建(或生成)为程序可访问的配置项
IConfigurationRoot Build();
}
访问 JSON 配置文件
{
"FontFamily": "Arial",
"FontSize": 16,
"Editor": {
"Background": "#F4F4F4",
"Foreground": "Black"
}
}
在 Main 函数中访问
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("UISetting.json");
var config = builder.Build();
foreach (var item in config.AsEnumerable())
{
Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
// 通过指定 Key 来访问其配置项值
Console.WriteLine("FontFamily: " + config["FontFamily"]);
Console.WriteLine("FontSize: " + config.GetValue<int>("FontSize"));
Console.WriteLine("Editor Foreground: " + config["Editor:Foreground"]);
// 对于层级结构,使用 GetSession
var editorSection = config.GetSection("Editor");
Console.WriteLine("Editor Background: " + editorSection["Background"]);
Console.Read();
添加其他类型的配置文件:
- AddXmlFile
- AddIniFile
- AddInMemoryCollection
- AddEnvironmentVariables
另外需要注意的是:
- 配置项键名不区分大小写
- 同一类型的配置源可以添加多个
- 可以通过双下划线代替冒号
如果希望改变上述添加配置的方式,可以创建 ConfigurationBuilder 实例并调用 IWebHostBuilder 接口的 UseConfiguration 方法
除了使用 UseConfiguration 方法之外,还可以使用 IWebHostBuilder 接口的 ConfigureAppConfiguration 方法,通过该方法,可以获取当前的运行环境,并加载与环境相关的配置文件
自定义配置源,需要用到两个接口,即 IConfigurationSource 和 IConfigurationProvider
由于 ASP.NET Core 提供的配置源中并不支持对 web.config 或 app.config 等这种传统类型的配置文件的访问,因此需要创建自定义配置源来访问,当配置源基于文件时,可以使用 FileConfigurationSource 和 FileConfigurationProvider
重新加载配置可以调用 IConfiguration 或 IConfigurationRoot 的 Reload 方法,即 config.Reload(),或者在添加配置源时指定 reloadOnChange 属性
强类型对象,我们希望将多个配置映射为具有同名属性的 .NET 对象,需要使用 Options 模式,在 ConfigureServices 方法内添加
services.Configure<UISetting>(Configuration);
这样不仅将配置信息映射到 UISetting 类,而且也会将 IOptions 对象放入当前应用程序的依赖注入容器中,因此,可以在 Controller 中注入该对象,并通过它的 Value 属性获取 IOptions 所包含的对象
最后,需要说明一点的是,要映射的类必须具有一个默认的构造函数,即公共且无参数的构造函数,否则无法编译通过
要将配置添加到容器,还可以使用 IServiceCollection.Configure 方法的另一个重载形式,它接受一个 Action 类型的参数
除了 Configure 方法外,还可以使用 PostConfigure 方法对 TOptions 进行后续的修改操作,此方法会在所有的 Configure 方法后执行
3.6 日志
日志包括两种类型:
- 系统日志:系统在运行时向外输出的记录日志
- 用户记录日志:由开发人员在程序适当的位置调用与日志功能相关的 API 输出的日志
ASP.NET Core 框架内部集成了日志的功能,主要由以下几个接口组成:
- Ilogger
- IloggerProvider
- IloggerFactory
public interface ILogger
{
void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter);
bool IsEnabled(LogLevel logLevel);
IDisposable BeginScope<TState>(TState state);
}
Log 方法的第一个参数指明了这条信息的级别,ASP.NET Core 日志系统定义了6个级别:
- Trace
- Debug
- Information
- Warning
- Error
- Critical
当 ASP.NET Core 应用程序运行起来,日志组件就会被添加到其依赖注入容器中,因此只要在合适的位置将 ILogger 对象注入进来,即可使用它来记录日志
在创建 WebHost 时,调用了 CreateDefaultBuilder 方法,在这里可以使用 ILoggingBuilder 接口的扩展方法 AddConsole、AddDebug、AddEnventSourceLogger 分别添加3个日志提供程序,它们提供了不同的输出位置和形式
ASP.NET Core 默认提供了以下6种日志提供程序:
- Console
- Debug
- EventSource
- EventLog
- TraceSource
- Azure App Service
如果不需要 CreateDefaultBuilder 默认添加的3个日志提供程序,可以调用 ILoggerProvider 接口的 ClearProviders 方法,然后再添加所需要的日志提供程序
ILoggerFacotry 接口用于创建 ILogger 类型的对象
public interface ILoggerFactory : IDisposable
{
ILogger CreateLogger(string categoryName);
void AddProvider(ILoggerProvider provider);
}
ILoggerFacotry 与 ILogger 一样,可以在程序任何位置注入使用
将日志信息进行分组,需要使用 Scope 来实现,ILogger 接口有一个方法,BeginScope(TState state) 用于创建 Scope
要在 scope 中输出日志,除了创建 scope 外,还要在 ILoggerProvider 对象中启用这一功能,在添加日志提供程序时可以指定该 ILoggerProvider 的一些选项,例如 ControllerProvidre,只要设置 ConsoleLoggerOptions 的 IncludeScopes 属性为 true 即可
要设置最低日志级别,同样需要在 ConfigureLogging 方法中进行设置,此时只要调用 ILoggingBuilder 接口的 SetMinimumLevel 方法即可
值得注意的是,在 LogLevel 的枚举定义中,还有一个值是 None,该值高于其他所有值,如果指定这个值为最低级别,则所有日志都不会输出
ILoggerBuilder 接口还提供了 AddFilter 方法,显示满足条件的日志
默认情况下,在 appsettings.json 文件中包含了对日志的配置信息,可以调用 AddConfiguration 方法将日志配置加载应用到程序的日志系统中
3.7 错误处理
异常处理,ASP.NET Core 中有两个中间件用来处理异常:
- DeveloperExceptionPageMiddleware
- ExceptionHandlerMiddleware
它们可以通过 Configure 方法中的 IApplicationBuilder 提供的 UseDeveloperExceptionPage 和 UseExceptionHandler 添加
需要强调的是,这两个中间件都应该在 Configure 方法一开始就添加进来,否则任何在它们之前的代码所产生的错误都不会被它们处理
另外,由这些中间件所输出的响应的 HTTP 状态码均为 500 Internal Server Error
默认情况下,ASP.NET Core 对于状态码没有提供具体的细节,使用 StatusCodePagesMiddleware 则能够自定义关于这些错误状态码的细节
如果要自定义显示结果,则可以调用 UseStatusCodePages 的另一个重载形式


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)的更多相关文章
- 使用ASP.NET Core构建RESTful API的技术指南
译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...
- 4类Storage方案(AS开发实战第四章学习笔记)
4.1 共享参数SharedPreferences SharedPreferences按照key-value对的方式把数据保存在配置文件中,该配置文件符合XML规范,文件路径是/data/data/应 ...
- 菜单Menu(AS开发实战第四章学习笔记)
4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...
- [Android]《Android艺术开发探索》第一章读书笔记
1. 典型情况下生命周期分析 (1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下 ...
- 温故知新,使用ASP.NET Core创建Web API,永远第一次
ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...
- 零基础ASP.NET Core WebAPI团队协作开发
零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- 从 0 使用 SpringBoot MyBatis MySQL Redis Elasticsearch打造企业级 RESTful API 项目实战
大家好!这是一门付费视频课程.新课优惠价 699 元,折合每小时 9 元左右,需要朋友的联系爱学啊客服 QQ:3469271680:我们每课程是明码标价的,因为如果售价为现在的 2 倍,然后打 5 折 ...
- Asp.Net Core 5 REST API - Step by Step
翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...
随机推荐
- VCODE修改控制台编码格式解决输出乱码问题
中文的windows下的cmd默认使用GBK的编码,敲代码时,页面使用的是UTF-8(65001),而powershell控制台默认使用的是GBK编码(936),用chcp命令可以查看.乱码主要是 ...
- Go socket 编程源码解析(上)
0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...
- AHB Matrix
常用的AHB Bus结构 AHB Matrix AHB Bus Matrix,即总线矩阵,其实际上就是一个互连(Interconnect).用于连接满足该总线协议的外设,包括Master和Slave. ...
- JQuery - CheckBox Prop 和 attr 的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.25)
来给大家伙送福利了! 一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘, ...
- Qt5.9 UI设计(三)——添加UI、类及资源文件
前言 设计一个软件,最简单的方式就是把控件直接往UI上放,然后再把功能实现了.这样可以实现基本的功能,但是界面不能缩放,如果拖动软件改变界面的大小,界面上的控件就会乱成一团,或者是界面的控件压根就不会 ...
- Oracle Rac 的简单学习
Oracle Rac 的简单学习 Oracle RAC的概念 Oracle RAC (Real Application Clusters) 是 Oracle 数据库管理系统的一个功能, 它允许将数据库 ...
- [转帖]金仓数据库KingbaseES分区表 -- 声明式创建分区表
https://www.modb.pro/db/638045 1. 创建分区表同时创建分区 1.1 准备环境 # 创建分区表同时创建分区 create table tb1(id bigint,stat ...
- Redis性能问题诊断以及scan命令耗时分析
Redis性能问题诊断以及scan命令耗时分析 摘要 最近公司有项目反馈卡顿. 卡顿一小时后自己被拉入群聊. 同事已经基本上定位到问题原因. 我这边想使用朴素的性能观点进行一下性能问题的拆解 为了提高 ...
- [转帖]如何通过shell脚本对一个文件中的所有数值相加并求和
https://developer.aliyun.com/article/886170?spm=a2c6h.24874632.expert-profile.255.7c46cfe9h5DxWK 1.背 ...