《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 ...
随机推荐
- Delete `␍`eslint(prettier/prettier)错误
最佳实践: 现在VScode,Notepad++编辑器都能够自动识别文件的换行符是LF还是CRLF. 如果你用的是windows,文件编码是UTF-8且包含中文,最好全局将autocrlf设置为fal ...
- opensips简介
概述 在众多的sip服务器中,主要有俩大类,一类侧重于媒体/业务服务器,比如freeswitch/asterisk,另一类侧重于代理/负载服务器,比如opensips/kamailio. 今天我们对o ...
- 使用vs插件进行远程调试linux服务器
魔改Raspberry Debugger插件实现linux远程开发 本插件是在树莓派的远程调试下修改实现并未全部本人实现 插件基本使用: 插件目前只能在.net core 3.1到.net 6的框架下 ...
- C#/.Net Core/WPF框架初建(国际化、主题色)
C#/.Net Core/WPF框架初建(国际化.主题色) English | 简体中文 作为 TerminalMACS 的一个子进程模块 - WPF管理端,目前搭建框架部分功能:本地化.国际化.主题 ...
- Go-测试-testing
- MySQL 8.2.0部署安装验证
MySQL 8.2.0部署安装验证 背景 昨天捯饬了半天Oracle23c Free版本发现自己白忙活了. 然后想着继续看一下 MySQL8.2. 看看会不会又继续白忙活 下载与安装 https:// ...
- [转帖][minio]挂载minio到本地
https://www.cnblogs.com/XY-Heruo/p/16489190.html 前言 将minio的bucket挂载到本地文件系统 环境 客户端系统版本:centos 7 MinIO ...
- [转帖]Jmeter中线程组和setUP线程组、tearDown线程组的区别
JMETER: setUP线程组:在测试任务ThreadGroup 运行前先被运行.通常用在运行测试任务前,做初始化工作.例如建立数据库连接初始分化工作.用户登录 tearDown线程组:在测试任务线 ...
- Redislabs的简单使用与benchmark测试结果
Redislabs的简单使用与benchmark测试结果 自己的理解 仅是理解. 没有看过源码 哨兵可以实现高可用, 但是对高吞吐是没有太大帮助的. 虽然可以实现主写从读, 但是在高并发的场景下延迟肯 ...
- 神经网络优化篇:详解超参数调试的实践:Pandas VS Caviar(Hyperparameters tuning in practice: Pandas vs. Caviar)
超参数调试的实践 如今的深度学习已经应用到许多不同的领域,某个应用领域的超参数设定,有可能通用于另一领域,不同的应用领域出现相互交融.比如,曾经看到过计算机视觉领域中涌现的巧妙方法,比如说Confon ...