ASP.NET Core 中文文档 第三章 原理(12)托管
原文:Hosting
作者:Steve Smith
翻譯:婁宇(Lyrics)
校對:何鎮(zhèn)汐、許登洋(Seay)
為了運行 ASP.NET Core 應(yīng)用程序,你需要使用 WebHostBuilder 配置和啟動一個宿主.
什么是宿主?
ASP.NET Core 應(yīng)用程序需要在宿主中執(zhí)行。宿主必須實現(xiàn) IWebHost 接口,這個接口暴露了功能和服務(wù)的集合,以及 Start 方法。宿主通常使用 WebHostBuilder 的實例進(jìn)行創(chuàng)建,該實例構(gòu)建并返回一個 WebHost 實例。WebHost 引用服務(wù)器來處理請求。學(xué)習(xí)更多關(guān)于 服務(wù)器。
宿主和服務(wù)器的不同之處是什么?
宿主負(fù)責(zé)應(yīng)用程序啟動和生命周期管理。服務(wù)器負(fù)責(zé)接受 HTTP 請求。確保應(yīng)用程序服務(wù)和服務(wù)器可用并正確配置也是宿主職責(zé)的一部分。你可以把宿主看作是服務(wù)器的包裝。宿主被配置為使用一個特定的服務(wù)器;服務(wù)器并不知道它的宿主。
設(shè)置宿主
使用 WebHostBuilder 實例創(chuàng)建一個宿主。這通常是在你的應(yīng)用程序入口點:public static void Main,(在項目模板的 Program.cs 文件中)。一個典型的 Program.cs 如下所示,演示如何使用 WebHostBuilder 來構(gòu)建一個宿主。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting;namespace WebApplication1 {public class Program{public static void Main(string[] args){var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();host.Run();}} }WebHostBuilder 負(fù)責(zé)創(chuàng)建宿主,宿主會啟動應(yīng)用程序服務(wù)器。WebHostBuilder 需要你提供實現(xiàn)了 IServer (上面代碼中的 UseKestrel) 接口的服務(wù)器。 UseKestrel 指定應(yīng)用程序會使用 Kestrel 服務(wù)器。
服務(wù)器的 內(nèi)容根 ( content root ) 決定它將在哪里搜索內(nèi)容文件,比如 MVC 視圖文件。默認(rèn)的內(nèi)容根是應(yīng)用程序運行的文件夾。
注解
指定 Directory.GetCurrentDirectory 作為內(nèi)容根時,當(dāng)應(yīng)用程序啟動時會使用 Web 項目的根目錄作為應(yīng)用程序的內(nèi)容根(比如,從 Web 項目文件夾調(diào)用 dotnet run)。Visual Studio 和 dotnet new 的模板是默認(rèn)使用 Directory.GetCurrentDirectory 作為內(nèi)容根的。
如果應(yīng)用程序需要使用 IIS,需要在構(gòu)建宿主時調(diào)用 UseIISIntegration 方法。注意這不是像 UseKestrel 那樣配置一個 服務(wù)器。為了讓 ASP.NET Core 使用 IIS,你必須同時指定 UseKestrel 和 UseIISIntegration。Kestrel 被設(shè)計為在代理后運行而不應(yīng)該直接部署到互聯(lián)網(wǎng)。UseIISIntegration 指定 IIS 為反向代理服務(wù)器。
注解
UseKestrel 與 UseIISIntegration 行為區(qū)別非常大。IIS 只是作為一個反向代理。UseKestrel 創(chuàng)建 Web 服務(wù)器并且對代碼進(jìn)行托管。UseIISIntegration 指定 IIS 作為反向代理服務(wù)器。它同時也檢查了 IIS/IISExpress 使用的環(huán)境變量并做出比如使用哪個動態(tài)端口,設(shè)置什么 Header 等決定。然而它不處理或者創(chuàng)建 IServer。
配置一個宿主(以及一個 ASP.NET Core 應(yīng)用程序)的最小實現(xiàn)僅僅包含一個服務(wù)器和應(yīng)用程序請求管道的配置:
var host = new WebHostBuilder().UseKestrel().Configure(app =>{app.Run(async (context) => await context.Response.WriteAsync("Hi!"));}).Build();host.Run();注解
當(dāng)設(shè)置一個宿主,你可以提供 Configure 和 ConfigureServices 方法,或者定義一個 Startup 類(也必須定義這些方法,參見 :doc:startup)。多次調(diào)用 ConfigureServices 會進(jìn)行追加配置;多次調(diào)用 Configure 或者 UseStartup 會替換之前的設(shè)置。
配置宿主
WebHostBuilder 提供了方法用于為宿主設(shè)置大多數(shù)可用的配置值,它也可以被設(shè)置為直接使用 UseSetting 以及相關(guān)的鍵。比如,指定應(yīng)用程序名字:
new WebHostBuilder().UseSetting("applicationName", "MyApp")宿主配置值
應(yīng)用程序名 string
鍵: applicationName。這個配置設(shè)定指定的值將從 IHostingEnvironment.ApplicationName 返回。
捕獲啟動異常 bool
鍵: captureStartupErrors。默認(rèn)是 false。當(dāng)值為 false 時,在啟動過程中的錯誤會導(dǎo)致宿主退出。當(dāng)值為 true 時,宿主會捕捉 Startup 類中的任何異常,并試圖啟動服務(wù)器。同時將為每個請求顯示錯誤頁面(一般的,或詳細(xì)的,這取決于下面提到的詳細(xì)錯誤設(shè)置)。 可使用 CaptureStartupErrors 方法設(shè)置。
內(nèi)容根 string
Key: contentRoot。默認(rèn)是應(yīng)用程序集所在的文件夾(針對 Kestrel;IIS 默認(rèn)使用 Web 項目根目錄)。這個設(shè)置決定了 ASP.NET Core 從哪里開始搜索內(nèi)容文件,比如 MVC 視圖。內(nèi)容根同時被作為 Web 根設(shè)置 的基礎(chǔ)路徑使用。可使用 UseContentRoot 方法設(shè)置。路徑必須是存在的,否則宿主會啟動失敗。
詳細(xì)錯誤 bool
鍵: detailedErrors。默認(rèn)是 false。當(dāng)值是 true 時(或者當(dāng)環(huán)境設(shè)置為“Development”時),應(yīng)用程序會顯示詳細(xì)的啟動錯誤信息,而不僅僅是一般的錯誤頁。可使用 UseSetting 設(shè)置。
當(dāng)詳細(xì)錯誤設(shè)置為 false 并且捕捉啟動異常是 true 時,服務(wù)器在每個請求的(錯誤)響應(yīng)中顯示一般錯誤頁。
當(dāng)詳細(xì)錯誤設(shè)置為 true 并且捕捉啟動異常是 true 時,服務(wù)器在每個請求的(錯誤)響應(yīng)中顯示詳細(xì)錯誤頁。
環(huán)境 string
鍵: environment。默認(rèn)是“Production”。可以設(shè)置為任何值。框架定義的值包含“Development”,“Staging”,以及“Production”。值不區(qū)分大小寫。參見 environments。可使用 UseEnvironment 方法設(shè)置。
注解
默認(rèn)情況下,環(huán)境是從 ASPNETCORE_ENVIRONMENT 環(huán)境變量中讀取。當(dāng)使用 Visual Studio,環(huán)境變量可能在 launchSettings.json 文件中進(jìn)行設(shè)置。
服務(wù)器 URLs string
鍵: urls。設(shè)置分號(;)來分隔服務(wù)器應(yīng)該響應(yīng)的 URL 前綴。比如,"http://localhost:123"。域名可以用“”替換,表明服務(wù)器需要針對任何使用指定端口及協(xié)議的 IP 地址或域名監(jiān)聽請求(比如,“http://:5000”或者 “https://*:5001”)。協(xié)議(“http://”或者“https://”)必須包含在每個URL里。前綴由配置好的服務(wù)器解釋;服務(wù)器之間支持的格式會有所不同。
啟動程序集 string
鍵: startupAssembly。決定搜索 Startup 類的程序集。可使用 UseStartup 方法設(shè)置。可以使用 WebHostBuilder.UseStartup<StartupType> 指定特定的引用類型。如果調(diào)用多次 UseStartup 方法,最后一個調(diào)用的生效。
Web 根 string
鍵: webroot。如果不指定,默認(rèn)是 (Content Root Path)\wwwroot,如果該路徑存在。如果這個路徑不存在,則使用一個沒有文件操作的提供器。可使用 UseWebRoot 方法設(shè)置。
使用 configuration 來設(shè)置宿主所需的配置值。這些值可能隨后被重寫。可使用 UseConfiguration 指定。
public static void Main(string[] args) {var config = new ConfigurationBuilder().AddCommandLine(args).AddJsonFile("hosting.json", optional: true).Build();var host = new WebHostBuilder().UseConfiguration(config).UseKestrel().Configure(app =>{app.Run(async (context) => await context.Response.WriteAsync("Hi!"));}).Build();host.Run(); }在上面的例子中,可以通過命令行參數(shù)配置宿主,或者在 hosting.json 文件中進(jìn)行配置。要指定在特定的網(wǎng)址上運行宿主,你可以從命令行傳遞所需要的值:
dotnet run --urls "http://*:5000"Run 方法啟動 Web 應(yīng)用程序并且阻止調(diào)用線程,直到宿主關(guān)閉。
host.Run();你可以通過調(diào)用宿主的 Start 方法來以非阻塞方式運行宿主。
using (host) {host.Start();Console.ReadLine(); }傳遞一個 URL 列表到 Start 方法,它將監(jiān)聽指定的 URL:
var urls = new List<string>() {"http://*:5000","http://localhost:5001"}; var host = new WebHostBuilder().UseKestrel().UseStartup<Startup>().Start(urls.ToArray());using (host) {Console.ReadLine(); }排序的重要性
WebHostBuilder 首先讀取某些環(huán)境變量中的設(shè)置(如果環(huán)境變量中設(shè)置了)。這些環(huán)境變量必須采用格式 ASPNETCORE_{configurationKey},因此假如要設(shè)置默認(rèn)情況下服務(wù)器監(jiān)聽的 URL,你需要設(shè)置 ASPNETCORE_URLS。
你可以通過指定配置來重寫任何環(huán)境變量(使用 UseConfiguration)或者明確地設(shè)置值(例如使用 UseUrls)。宿主會使用任何選項最后設(shè)置的值。因此,UseIISIntegration 必須出現(xiàn)在 UseUrls 之后,因為它將替換 IIS 動態(tài)提供的 URL。如果你想以編程方式設(shè)置默認(rèn) URL 的值,但是允許他通過配置重寫,你需要如下配置宿主:
var config = new ConfigurationBuilder() .AddCommandLine(args) .Build();var host = new WebHostBuilder().UseUrls("http://*:1000") // default URL.UseConfiguration(config) // override from command line.UseKestrel().Build();額外的資源
- Publishing to IIS
- Publish to a Linux Production Environment
- Hosting ASP.NET Core as a Windows Service
- Hosting ASP.NET Core Embedded in Another Application
轉(zhuǎn)載于:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_12-hosting.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 中文文档 第三章 原理(12)托管的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python后端工程师 数据爬虫
- 下一篇: 矢量切片格式规范