第 3 章 ASP.NET Core 核心特性
3.5 配置
要訪問配置,需要使用 ConfigurationBinder 類,它實(shí)現(xiàn)了 IConfigurationBuilder 接口,該接口包括兩個(gè)重要的方法:
public interface IConfigurationBuilder
{
// 添加不同形式的配置源
IConfigurationBuilder Add(IConfigurationSource source);
// 把所有添加的配置源中的配置信息構(gòu)建(或生成)為程序可訪問的配置項(xiàng)
IConfigurationRoot Build();
}
訪問 JSON 配置文件
{
"FontFamily": "Arial",
"FontSize": 16,
"Editor": {
"Background": "#F4F4F4",
"Foreground": "Black"
}
}
在 Main 函數(shù)中訪問
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 來訪問其配置項(xiàng)值
Console.WriteLine("FontFamily: " + config["FontFamily"]);
Console.WriteLine("FontSize: " + config.GetValue<int>("FontSize"));
Console.WriteLine("Editor Foreground: " + config["Editor:Foreground"]);
// 對(duì)于層級(jí)結(jié)構(gòu),使用 GetSession
var editorSection = config.GetSection("Editor");
Console.WriteLine("Editor Background: " + editorSection["Background"]);
Console.Read();
添加其他類型的配置文件:
- AddXmlFile
- AddIniFile
- AddInMemoryCollection
- AddEnvironmentVariables
另外需要注意的是:
- 配置項(xiàng)鍵名不區(qū)分大小寫
- 同一類型的配置源可以添加多個(gè)
- 可以通過雙下劃線代替冒號(hào)
如果希望改變上述添加配置的方式,可以創(chuàng)建 ConfigurationBuilder 實(shí)例并調(diào)用 IWebHostBuilder 接口的 UseConfiguration 方法
除了使用 UseConfiguration 方法之外,還可以使用 IWebHostBuilder 接口的 ConfigureAppConfiguration 方法,通過該方法,可以獲取當(dāng)前的運(yùn)行環(huán)境,并加載與環(huán)境相關(guān)的配置文件
自定義配置源,需要用到兩個(gè)接口,即 IConfigurationSource 和 IConfigurationProvider
由于 ASP.NET Core 提供的配置源中并不支持對(duì) web.config 或 app.config 等這種傳統(tǒng)類型的配置文件的訪問,因此需要?jiǎng)?chuàng)建自定義配置源來訪問,當(dāng)配置源基于文件時(shí),可以使用 FileConfigurationSource 和 FileConfigurationProvider
重新加載配置可以調(diào)用 IConfiguration 或 IConfigurationRoot 的 Reload 方法,即 config.Reload(),或者在添加配置源時(shí)指定 reloadOnChange 屬性
強(qiáng)類型對(duì)象,我們希望將多個(gè)配置映射為具有同名屬性的 .NET 對(duì)象,需要使用 Options 模式,在 ConfigureServices 方法內(nèi)添加
services.Configure<UISetting>(Configuration);
這樣不僅將配置信息映射到 UISetting 類,而且也會(huì)將 IOptions 對(duì)象放入當(dāng)前應(yīng)用程序的依賴注入容器中,因此,可以在 Controller 中注入該對(duì)象,并通過它的 Value 屬性獲取 IOptions 所包含的對(duì)象
最后,需要說明一點(diǎn)的是,要映射的類必須具有一個(gè)默認(rèn)的構(gòu)造函數(shù),即公共且無參數(shù)的構(gòu)造函數(shù),否則無法編譯通過
要將配置添加到容器,還可以使用 IServiceCollection.Configure 方法的另一個(gè)重載形式,它接受一個(gè) Action 類型的參數(shù)
除了 Configure 方法外,還可以使用 PostConfigure 方法對(duì) TOptions 進(jìn)行后續(xù)的修改操作,此方法會(huì)在所有的 Configure 方法后執(zhí)行
3.6 日志
日志包括兩種類型:
- 系統(tǒng)日志:系統(tǒng)在運(yùn)行時(shí)向外輸出的記錄日志
- 用戶記錄日志:由開發(fā)人員在程序適當(dāng)?shù)奈恢谜{(diào)用與日志功能相關(guān)的 API 輸出的日志
ASP.NET Core 框架內(nèi)部集成了日志的功能,主要由以下幾個(gè)接口組成:
- 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 方法的第一個(gè)參數(shù)指明了這條信息的級(jí)別,ASP.NET Core 日志系統(tǒng)定義了6個(gè)級(jí)別:
- Trace
- Debug
- Information
- Warning
- Error
- Critical
當(dāng) ASP.NET Core 應(yīng)用程序運(yùn)行起來,日志組件就會(huì)被添加到其依賴注入容器中,因此只要在合適的位置將 ILogger 對(duì)象注入進(jìn)來,即可使用它來記錄日志
在創(chuàng)建 WebHost 時(shí),調(diào)用了 CreateDefaultBuilder 方法,在這里可以使用 ILoggingBuilder 接口的擴(kuò)展方法 AddConsole、AddDebug、AddEnventSourceLogger 分別添加3個(gè)日志提供程序,它們提供了不同的輸出位置和形式
ASP.NET Core 默認(rèn)提供了以下6種日志提供程序:
- Console
- Debug
- EventSource
- EventLog
- TraceSource
- Azure App Service
如果不需要 CreateDefaultBuilder 默認(rèn)添加的3個(gè)日志提供程序,可以調(diào)用 ILoggerProvider 接口的 ClearProviders 方法,然后再添加所需要的日志提供程序
ILoggerFacotry 接口用于創(chuàng)建 ILogger 類型的對(duì)象
public interface ILoggerFactory : IDisposable
{
ILogger CreateLogger(string categoryName);
void AddProvider(ILoggerProvider provider);
}
ILoggerFacotry 與 ILogger 一樣,可以在程序任何位置注入使用
將日志信息進(jìn)行分組,需要使用 Scope 來實(shí)現(xiàn),ILogger 接口有一個(gè)方法,BeginScope(TState state) 用于創(chuàng)建 Scope
要在 scope 中輸出日志,除了創(chuàng)建 scope 外,還要在 ILoggerProvider 對(duì)象中啟用這一功能,在添加日志提供程序時(shí)可以指定該 ILoggerProvider 的一些選項(xiàng),例如 ControllerProvidre,只要設(shè)置 ConsoleLoggerOptions 的 IncludeScopes 屬性為 true 即可
要設(shè)置最低日志級(jí)別,同樣需要在 ConfigureLogging 方法中進(jìn)行設(shè)置,此時(shí)只要調(diào)用 ILoggingBuilder 接口的 SetMinimumLevel 方法即可
值得注意的是,在 LogLevel 的枚舉定義中,還有一個(gè)值是 None,該值高于其他所有值,如果指定這個(gè)值為最低級(jí)別,則所有日志都不會(huì)輸出
ILoggerBuilder 接口還提供了 AddFilter 方法,顯示滿足條件的日志
默認(rèn)情況下,在 appsettings.json 文件中包含了對(duì)日志的配置信息,可以調(diào)用 AddConfiguration 方法將日志配置加載應(yīng)用到程序的日志系統(tǒng)中
3.7 錯(cuò)誤處理
異常處理,ASP.NET Core 中有兩個(gè)中間件用來處理異常:
- DeveloperExceptionPageMiddleware
- ExceptionHandlerMiddleware
它們可以通過 Configure 方法中的 IApplicationBuilder 提供的 UseDeveloperExceptionPage 和 UseExceptionHandler 添加
需要強(qiáng)調(diào)的是,這兩個(gè)中間件都應(yīng)該在 Configure 方法一開始就添加進(jìn)來,否則任何在它們之前的代碼所產(chǎn)生的錯(cuò)誤都不會(huì)被它們處理
另外,由這些中間件所輸出的響應(yīng)的 HTTP 狀態(tài)碼均為 500 Internal Server Error
默認(rèn)情況下,ASP.NET Core 對(duì)于狀態(tài)碼沒有提供具體的細(xì)節(jié),使用 StatusCodePagesMiddleware 則能夠自定義關(guān)于這些錯(cuò)誤狀態(tài)碼的細(xì)節(jié)
如果要自定義顯示結(jié)果,則可以調(diào)用 UseStatusCodePages 的另一個(gè)重載形式
本文摘自 :https://blog.51cto.com/u