ASP.NET?Core配置和管理Web主機(jī)
1.前言
ASP.NET Core應(yīng)用程序可以配置和啟動(dòng)主機(jī)(Host)。主機(jī)負(fù)責(zé)應(yīng)用程序啟動(dòng)和生命周期管理,配置服務(wù)器和請(qǐng)求處理管道。主機(jī)還可以設(shè)置日志記錄、依賴(lài)關(guān)系注入和配置。而Host主機(jī)又包括Web主機(jī)(IWebHostBuilder)和通用主機(jī)(IHostBuilder)。該章節(jié)主要介紹了用于托管Web應(yīng)用的Web主機(jī)。對(duì)于其他類(lèi)型的應(yīng)用,請(qǐng)使用通用主機(jī)。
2.設(shè)置主機(jī)
創(chuàng)建使用IWebHostBuilder實(shí)例的主機(jī)。通常在應(yīng)用程序的入口點(diǎn)來(lái)執(zhí)行Main方法。在項(xiàng)目模板中,Main位于Program.cs。典型應(yīng)用默認(rèn)調(diào)用CreateDefaultBuilder來(lái)開(kāi)始創(chuàng)建主機(jī):
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}2.1執(zhí)行下列任務(wù)
調(diào)用CreateDefaultBuilder的代碼位于名為CreateWebHostBuilder的方法中,這讓它區(qū)分于 Main中對(duì)生成器對(duì)象調(diào)用Run的代碼。CreateDefaultBuilder執(zhí)行下列任務(wù):
●使用應(yīng)用程序的托管配置提供應(yīng)用程序?qū)estrel服務(wù)器配置為Web服務(wù)器。
●將內(nèi)容根設(shè)置為由 Directory.GetCurrentDirectory返回的路徑。
●通過(guò)以下對(duì)象加載主機(jī)配置:
○前綴為ASPNETCORE_的環(huán)境變量(例如,ASPNETCORE_ENVIRONMENT)。
○命令行參數(shù)。
●按以下順序加載應(yīng)用程序配置:
○appsettings.json。
○appsettings.{Environment}.json。
○應(yīng)用在使用入口程序集的Development環(huán)境中運(yùn)行時(shí)的機(jī)密管理器。
○環(huán)境變量。
○命令行參數(shù)。
●配置控制臺(tái)和調(diào)試輸出的日志記錄。日志記錄包含appsettings.json或appsettings.{Environment}.json文件的日志記錄配置部分中指定的日志篩選規(guī)則。
●使用ASP.NET Core模塊在IIS后面運(yùn)行時(shí),CreateDefaultBuilder會(huì)啟用IIS集成,這會(huì)配置應(yīng)用程序的基址和端口。IIS集成還配置應(yīng)用程序以捕獲啟動(dòng)錯(cuò)誤。
●如果應(yīng)用環(huán)境為“開(kāi)發(fā)(Development)”,請(qǐng)將ServiceProviderOptions.ValidateScopes設(shè)為true。
2.2重寫(xiě)和增強(qiáng)定義的配置
ConfigureAppConfiguration、ConfigureLogging以及IWebHostBuilder的其他方法和擴(kuò)展方法可重寫(xiě)和增強(qiáng)CreateDefaultBuilder定義的配置。下面是一些示例:
●ConfigureAppConfiguration:用于指定應(yīng)用程序的其他IConfiguration。下面的ConfigureAppConfiguration調(diào)用添加委托,以在appsettings.xml文件中添加應(yīng)用程序配置,該示例在Core系列第11章節(jié)有演示??啥啻握{(diào)用ConfigureAppConfiguration。請(qǐng)注意,此配置不適用于主機(jī)(例如,服務(wù)器URL或環(huán)境)。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);
});●ConfigureLogging:ConfigureLogging調(diào)用添加委托,將最小日志記錄級(jí)別 (SetMinimumLevel)配置為L(zhǎng)ogLevel.Warning。此設(shè)置重寫(xiě)CreateDefaultBuilder在appsettings.Development.json和appsettings.Production.json中配置,分別為L(zhǎng)ogLevel.Debug和LogLevel.Error。可多次調(diào)用 ConfigureLogging。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.SetMinimumLevel(LogLevel.Warning);
});●ConfigureKestrel:調(diào)用ConfigureKestrel來(lái)重寫(xiě)CreateDefaultBuilder在配置Kestrel時(shí)建立的30,000,000字節(jié)默認(rèn)Limits.MaxRequestBodySize:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureKestrel((context, options) =>
{
options.Limits.MaxRequestBodySize = 20000000;
});設(shè)置主機(jī)時(shí),可以提供配置和ConfigureServices方法。如果指定Startup類(lèi),必須定義Configure方法。
3.主機(jī)配置值
WebHostBuilder依賴(lài)于以下的方法設(shè)置主機(jī)配置值:
●主機(jī)生成器配置,其中包括格式ASPNETCORE_{configurationKey}的環(huán)境變量。例如 ASPNETCORE_ENVIRONMENT。
●UseContentRoot和UseConfiguration等擴(kuò)展。
●UseSetting和關(guān)聯(lián)鍵。使用UseSetting設(shè)置值時(shí),該值設(shè)置為無(wú)論何種類(lèi)型的字符串。
3.1應(yīng)用程序鍵(名稱(chēng))
在主機(jī)構(gòu)造期間調(diào)用UseStartup或Configure時(shí),會(huì)自動(dòng)設(shè)置 IHostingEnvironment.ApplicationName屬性。該值設(shè)置為包含應(yīng)用入口點(diǎn)的程序集的名稱(chēng)。要顯式設(shè)置值,請(qǐng)使用WebHostDefaults.ApplicationKey(環(huán)境變量:ASPNETCORE_APPLICATIONNAME):
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//應(yīng)用程序默認(rèn)名稱(chēng)為:CoreWeb (也就是項(xiàng)目名稱(chēng))
string an = env.ApplicationName;
...
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args).UseStartup<Startup>()
.UseSetting(WebHostDefaults.ApplicationKey, "CoreWeb");3.2捕獲啟動(dòng)錯(cuò)誤
此設(shè)置控制啟動(dòng)錯(cuò)誤的捕獲。當(dāng)false時(shí),啟動(dòng)期間出錯(cuò)導(dǎo)致主機(jī)退出。當(dāng)true時(shí),主機(jī)在啟動(dòng)期間捕獲異常并嘗試啟動(dòng)服務(wù)器(環(huán)境變量:ASPNETCORE_CAPTURESTARTUPERRORS)。
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(true)3.3內(nèi)容根
此設(shè)置確定ASP.NET Core開(kāi)始搜索內(nèi)容文件,如MVC視圖等。內(nèi)容根也用作Web根設(shè)置的基路徑。如果路徑不存在,主機(jī)將無(wú)法啟動(dòng)(環(huán)境變量:ASPNETCORE_CONTENTROOT)。
WebHost.CreateDefaultBuilder(args)
.UseContentRoot("c:\\<content-root>")3.4詳細(xì)錯(cuò)誤
確定是否應(yīng)捕獲詳細(xì)錯(cuò)誤。啟用(或當(dāng)環(huán)境設(shè)置為Development)時(shí),應(yīng)用捕獲詳細(xì)的異常(環(huán)境變量:ASPNETCORE_DETAILEDERRORS)。
WebHost.CreateDefaultBuilder(args)
.UseSetting(WebHostDefaults.DetailedErrorsKey, "true")3.5環(huán)境
設(shè)置應(yīng)用程序的環(huán)境。環(huán)境可以設(shè)置為任何值??蚣芏x的值包括Development、Staging和Production。值不區(qū)分大小寫(xiě)。默認(rèn)情況下,從ASPNETCORE_ENVIRONMENT環(huán)境變量讀取環(huán)境。使用Visual Studio時(shí),可能會(huì)在launchSettings.json文件中設(shè)置環(huán)境變量。有關(guān)于環(huán)境詳情信息,可以移步到Core系列第10章節(jié)有參閱(環(huán)境變量:ASPNETCORE_ENVIRONMENT)。
WebHost.CreateDefaultBuilder(args)
.UseEnvironment(EnvironmentName.Development)3.6HTTPS端口
設(shè)置HTTPS重定向端口。用于強(qiáng)制實(shí)施HTTPS(環(huán)境變量:ASPNETCORE_HTTPS_PORT)。
WebHost.CreateDefaultBuilder(args)
.UseSetting("https_port", "8080")3.7服務(wù)器(Kestrel) URL
指示IP地址或主機(jī)地址,其中包含服務(wù)器應(yīng)針對(duì)請(qǐng)求偵聽(tīng)的端口和協(xié)議。設(shè)置為服務(wù)器應(yīng)響應(yīng)的以分號(hào)分隔 (;) 的URL前綴列表。例如 http://localhost:123。使用“*”指示服務(wù)器應(yīng)針對(duì)請(qǐng)求偵聽(tīng)的使用特定端口和協(xié)議(例如 http://*:5000)的IP地址或主機(jī)名。協(xié)議(http://或https://)必須包含每個(gè)URL。不同的服務(wù)器支持的格式有所不同(環(huán)境變量:ASPNETCORE_URLS)。
WebHost.CreateDefaultBuilder(args)
.UseUrls("https://*:5000;https://localhost:5001;https://hostname:5002")

4.重寫(xiě)配置
使用配置可以配置Web主機(jī)。在下面的示例中,主機(jī)配置是根據(jù)需要在hostsettings.json文件中指定。命令行參數(shù)可能會(huì)重寫(xiě)從hostsettings.json文件加載的任何配置。生成的配置(在config中)用于通過(guò)UseConfiguration配置主機(jī)。
新建一個(gè)hostsettings.json文件,內(nèi)容如下:
{
"urls": "https://*:5005"
}public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
//IConfigurationBuilder的配置主機(jī)
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
//主機(jī)配置在hostsettings.json文件中指定
.AddJsonFile("hostsettings.json", optional: true)
//輸入的命令行參數(shù)可能會(huì)重寫(xiě)從hostsettings.json文件加載的任何配置
.AddCommandLine(args)
.Build();
return WebHost.CreateDefaultBuilder(args)
.UseUrls("https://*:5001")
.UseConfiguration(config)
.Configure(app =>
{
//生成的配置委托函數(shù)
app.Run(context =>
context.Response.WriteAsync("Hello, World!"));
});
}上述代碼描述意思是若要指定在特定的URL上運(yùn)行的主機(jī),所需的值可以在執(zhí)行dotnet運(yùn)行時(shí)從命令提示符傳入。命令行參數(shù)重寫(xiě)hostsettings.json文件中的urls值,且服務(wù)器偵聽(tīng)端口8080:
dotnet run --urls "http://*:8080"
主機(jī)啟動(dòng)時(shí),先用hostsettings.json config重寫(xiě)UseUrls提供的urls參數(shù)配置,然后再用命令行參數(shù)config重寫(xiě)hostsettings.json config的urls參數(shù)配置。
5.管理主機(jī)
管理主機(jī)啟動(dòng)方式有Run和Start兩種。Run方法啟動(dòng)Web應(yīng)用程序并阻止調(diào)用線(xiàn)程,直到關(guān)閉主機(jī)。Start方法通過(guò)調(diào)用自身以非阻止方式運(yùn)行主機(jī)。
//Run CreateWebHostBuilder(args).Build().Run();
//Start:非阻止方式,所有必須加上ReadLine CreateWebHostBuilder(args).Build().Start(); Console.ReadLine();
6.IHostingEnvironment接口
IHostingEnvironment接口提供有關(guān)應(yīng)用的Web承載環(huán)境的信息。使用構(gòu)造函數(shù)注入獲取 IHostingEnvironment以使用其屬性和擴(kuò)展方法:
//示例1:
public class CustomFileReader
{
private readonly IHostingEnvironment _env;
public CustomFileReader(IHostingEnvironment env)
{
_env = env;
}
public string ReadFile(string filePath)
{
var fileProvider = _env.WebRootFileProvider;
// Process the file here
}
}可以用于在啟動(dòng)時(shí)基于環(huán)境配置應(yīng)用程序或者將IHostingEnvironment注入到Startup構(gòu)造函數(shù),用于ConfigureServices:
//示例2:
public class Startup
{
public Startup(IHostingEnvironment env)
{
HostingEnvironment = env;
}
public IHostingEnvironment HostingEnvironment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (HostingEnvironment.IsDevelopment())
{
// Development configuration
}
else
{
// Staging/Production configuration
}
var contentRootPath = HostingEnvironment.ContentRootPath;
}
}IHostingEnvironment服務(wù)還可以直接注入到Configure方法以設(shè)置處理管道:
//示例3:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
// In Development, use the Developer Exception Page
app.UseDeveloperExceptionPage();
}
else
{
// In Staging/Production, route exceptions to /error
app.UseExceptionHandler("/error");
}
var contentRootPath = env.ContentRootPath;
}創(chuàng)建自定義中間件(要了解中間件的同學(xué)們,可以移步到第四章節(jié)學(xué)習(xí))時(shí)可以將IHostingEnvironment 注入Invoke方法:
public async Task Invoke(HttpContext context, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
// Configure middleware for Development
}
else
{
// Configure middleware for Staging/Production
}
var contentRootPath = env.ContentRootPath;
}7.IApplicationLifetime接口
IApplicationLifetime允許后啟動(dòng)和關(guān)閉活動(dòng)。接口上的三個(gè)屬性是用于注冊(cè)Action方法(用于定義啟動(dòng)和關(guān)閉事件)的取消標(biāo)記。
取消標(biāo)記 | 觸發(fā)條件 |
ApplicationStarted | 主機(jī)已完全啟動(dòng)。 |
ApplicationStopped | 主機(jī)正在完成正常關(guān)閉。應(yīng)處理所有請(qǐng)求。 關(guān)閉受到阻止,直到完成此事件。 |
ApplicationStopping | 主機(jī)正在執(zhí)行正常關(guān)閉。仍在處理請(qǐng)求。關(guān)閉受到阻止,直到完成此事件。 |
public class Startup
{
public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime)
{
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
appLifetime.ApplicationStopped.Register(OnStopped);
Console.CancelKeyPress += (sender, eventArgs) =>
{
appLifetime.StopApplication();
// Don't terminate the process immediately, wait for the Main thread to exit gracefully.
eventArgs.Cancel = true;
};
}
private void OnStarted()
{
// Perform post-startup activities here
}
private void OnStopping()
{
// Perform on-stopping activities here
}
private void OnStopped()
{
// Perform post-stopped activities here
}
}StopApplication是請(qǐng)求應(yīng)用終止的意思。以下類(lèi)在調(diào)用類(lèi)的Shutdown方法時(shí)使用StopApplication正常關(guān)閉應(yīng)用:
public class MyClass
{
private readonly IApplicationLifetime _appLifetime;
public MyClass(IApplicationLifetime appLifetime)
{
_appLifetime = appLifetime;
}
public void Shutdown()
{
_appLifetime.StopApplication();
}
}8.作用域驗(yàn)證
如果應(yīng)用環(huán)境為“開(kāi)發(fā)(Development)”,則CreateDefaultBuilder將ServiceProviderOptions.ValidateScopes設(shè)為true。若將ValidateScopes設(shè)為true,默認(rèn)服務(wù)提供應(yīng)用程序會(huì)執(zhí)行檢查來(lái)驗(yàn)證以下內(nèi)容:
●作用域服務(wù)不能直接或間接地從根服務(wù)提供者解析。
●作用域服務(wù)不會(huì)直接或間接地注入到單例中(服務(wù)的生命周期)。
若要始終驗(yàn)證作用域(包括在生命周期環(huán)境中驗(yàn)證),請(qǐng)使用主機(jī)生成器上的 UseDefaultServiceProvider配置ServiceProviderOptions:
WebHost.CreateDefaultBuilder(args)
.UseDefaultServiceProvider((context, options) => {
options.ValidateScopes = true;
})到此這篇關(guān)于ASP.NET Core配置和管理Web主機(jī)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .NET?Core使用CZGL.SystemInfo庫(kù)獲取主機(jī)運(yùn)行資源
- 快速了解如何在.NETCORE中使用Generic-Host建立主機(jī)
- Asp.Net Core利用xUnit進(jìn)行主機(jī)級(jí)別的網(wǎng)絡(luò)集成測(cè)試詳解
- ASP.NET Core Web API 教程Project Configuration
- 詳解如何在ASP.NET Core Web API中以三種方式返回?cái)?shù)據(jù)
- asp.net core webapi文件上傳功能的實(shí)現(xiàn)
- 詳解ASP.NET Core Web Api之JWT刷新Token
相關(guān)文章
.Net行為型設(shè)計(jì)模式之職責(zé)鏈模式(Chain of Responsibility)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之職責(zé)鏈模式(Chain of Responsibility),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
ASP.NET與數(shù)據(jù)庫(kù)相關(guān)技巧
[紅色]ASP.NET與數(shù)據(jù)庫(kù)相關(guān)技巧...2006-10-10
asp.net FindControl方法誤區(qū)和解析
在ASP.NET中Control都有一個(gè)FindControl方法,其作用是根據(jù)ID(注意既不是UniqueID也不是ClientID)在Control所在的命名容器中尋找相應(yīng)控件,但實(shí)際使用中存在很多誤區(qū)和陷阱,下面談?wù)剛€(gè)人對(duì)此的理解2012-01-01
WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證
這篇文章介紹了WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01

