《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 ...
随机推荐
- Liunx快捷命令(别名)与快捷方式(软/硬链接)
一.快捷命令(别名)-临时生效1.命令:alias 别名='原命令' 2.举例:给检查防火墙的命令设置别名 [root@localhost ~]# alias fhq='firewall-cmd -- ...
- java项目实践-cookie-session-day18
目录 1. cookie 2. session 3. servletcontext 4.servletConfig 1. cookie cookie 在客户端(浏览器)中保持http状态的 信息技术 ...
- linux 对子用户配置java 环境变量
转载请注明出处: 若服务器安装 jdk 时用的是root 用户,则root 用户登录服务器可以直接获取Java环境. 当切换到其他子用户时,则会发现环境不存在,命令不存在等. 解决方案: 1. 先切换 ...
- B2033 A*B 问题
A*B 问题 题目描述 输入两个正整数 \(A\) 和 \(B\),求 \(A \times B\) 的值.注意乘积的范围和数据类型的选择. 输入格式 一行,包含两个正整数 \(A\) 和 \(B\) ...
- 【ThreadX-NetX Duo】Azure RTOS NetX Duo概述
Azure RTOS NetX Duo嵌入式TCP / IP网络堆栈是Microsoft高级的工业级双IPv4和IPv6 TCP / IP网络堆栈,专门为深度嵌入式,实时和IoT应用程序设计.NetX ...
- [转帖]python print如何格式化输出变量长度固定某个长度
https://zhuanlan.zhihu.com/p/595778735 在 Python 中,可以使用格式化字符串的方法来格式化输出变量. 例如,要将一个字符串变量 s 输出为 10 个字符长度 ...
- [转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践
返回全部 边城元元案例实践2022-08-02 复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对.本文根据 TUG 用户边城元元 ...
- [转帖]TiKV读写流程浅析
https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1 TiKV整体架构图 1.1.各模块说明 PD Cluster ...
- [转帖]分享一个Navicat16最新版永久试用的办法
https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...
- 【转帖】JAVA GC日志分析
https://zhuanlan.zhihu.com/p/613592552 目录 1. GC分类 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Par ...