《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)

2021-01-13 15:41:48 浏览数 (1)

第 3 章 ASP.NET Core 核心特性

3.5 配置

要访问配置,需要使用 ConfigurationBinder 类,它实现了 IConfigurationBuilder 接口,该接口包括两个重要的方法:

代码语言:javascript复制
public interface IConfigurationBuilder
{
    // 添加不同形式的配置源
    IConfigurationBuilder Add(IConfigurationSource source);
    // 把所有添加的配置源中的配置信息构建(或生成)为程序可访问的配置项
    IConfigurationRoot Build();
}

访问 JSON 配置文件

代码语言:javascript复制
{
  "FontFamily": "Arial",
  "FontSize": 16,
  "Editor": {
    "Background": "#F4F4F4",
    "Foreground": "Black" 
  }
}

在 Main 函数中访问

代码语言:javascript复制
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 方法内添加

代码语言:javascript复制
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
代码语言:javascript复制
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 类型的对象

代码语言:javascript复制
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 的另一个重载形式

0 人点赞