淺談ASP.NET Core的幾種托管方式
Kestrel
Kestrel 是一個(gè)跨平臺(tái)的適用于 ASP.NET Core 的 Web 服務(wù)器,默認(rèn)包括在 ASP.NET Core 項(xiàng)目模板中。
Kestrel 支持以下方案:
- HTTPS
- 用于啟用 WebSocket 的不透明升級(jí)
- 用于獲得 Nginx 高性能的 Unix 套接字
- HTTP/2(除 macOS† 以外)
可以單獨(dú)使用 Kestrel,也可以將其與反向代理服務(wù)器 (如 Internet Information Services (IIS)、Nginx 或 Apache)結(jié)合使用。 反向代理服務(wù)器接收來自網(wǎng)絡(luò)的 HTTP 請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)發(fā)到 Kestrel。
Kestrel 用作邊緣(面向 Internet)Web 服務(wù)器:
Kestrel 用于反向代理配置:
實(shí)例
為了看起來更加簡單直接,這里我們使用VS Code新建一個(gè)ASP.NET Core的Web應(yīng)用,并使用Kestrel作為服務(wù)器。
首先需要在計(jì)算機(jī)上安裝.NET Core環(huán)境。這里可以查看 官網(wǎng) 。本例中使用的是.NET Core 3.1。
- 新建APS.NET Core Web應(yīng)用
在一個(gè)目錄下打開命令窗口,輸入命令:
dotnet new webapp -o myapp
這樣,就使用默認(rèn)模板新建了一個(gè)項(xiàng)目。如果是首次安裝使用.NET Core,還需要信任證書:
dotnet dev-certs https --trust
此時(shí),這個(gè)項(xiàng)目可以直接運(yùn)行:
cd myapp dotnet watch run
此時(shí)就是以內(nèi)置的Kestrel作為服務(wù)器直接運(yùn)行的。我們修改一下代碼,查看一下運(yùn)行時(shí)的進(jìn)程,修改Pages/Index.cshtml如下:
@page @using System.Diagnostics @model IndexModel @{ ViewData["Title"] = "Home page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p> "@Process.GetCurrentProcess().ProcessName" </p> <p>Learn about <a rel="external nofollow" >building Web apps with ASP.NET Core</a>.</p> </div>
運(yùn)行程序我們看到:
此時(shí)的進(jìn)程名稱就是我們的應(yīng)用名稱。接下來我們以這個(gè)代碼為基礎(chǔ),分別看看其他托管模式中的情況。
IIS
在IIS中托管ASP.NET Core應(yīng)用需要ASP.NET Core 模塊。
ASP.NET Core 模塊是插入 IIS 管道的本機(jī) IIS 模塊,用于:
- 在 IIS 工作進(jìn)程 (w3wp.exe) 內(nèi)托管 ASP.NET Core 應(yīng)用,稱為進(jìn)程內(nèi)托管模型。
- 將 Web 請(qǐng)求轉(zhuǎn)發(fā)到運(yùn)行 Kestrel 服務(wù)器的后端 ASP.NET Core 應(yīng)用,稱為進(jìn)程外托管模型。
在進(jìn)程內(nèi)托管時(shí),該模塊會(huì)使用 IIS 進(jìn)程內(nèi)服務(wù)器實(shí)現(xiàn),即 IIS HTTP 服務(wù)器 (IISHttpServer)。
在進(jìn)程外托管時(shí),該模塊僅適用于 Kestrel。 該模塊無法與 HTTP.sys 一起工作。
進(jìn)程內(nèi)托管
ASP.NET Core 應(yīng)用默認(rèn)為進(jìn)程內(nèi)托管模型。在進(jìn)程內(nèi)托管時(shí),使用 IIS HTTP 服務(wù)器 (IISHttpServer) 而不是 Kestrel 服務(wù)器。
實(shí)例
代碼還是與之前相同的代碼,首先將代碼發(fā)布一下:
dotnet publish --configuration Release
接下來將publish文件夾中的文件托管到IIS中。
要在IIS中托管ASP.NET Core網(wǎng)站,首先要安裝.NET Core 托管捆綁包安裝程序 ,安裝后重啟電腦或在命令行中執(zhí)行:
net stop was /y
之后執(zhí)行:
net start w3svc
然后在IIS中新建網(wǎng)站,并將根目錄指向上一步中的publish文件夾,瀏覽網(wǎng)站可以看到:
此時(shí)進(jìn)程名稱為:w3wp。這就是默認(rèn)的進(jìn)程內(nèi)托管模式。
進(jìn)程外托管
進(jìn)程外托管使用 Kestrel 服務(wù)器,而不是 IIS HTTP 服務(wù)器 (IISHttpServer)。
若要配置進(jìn)程外托管應(yīng)用,請(qǐng)?jiān)陧?xiàng)目文件 ( .csproj) 中將 屬性的值設(shè)置為 OutOfProcess:
<PropertyGroup> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup>
Process.GetCurrentProcess().ProcessName 報(bào)告w3wp/iisexpress(進(jìn)程內(nèi))或 dotnet(進(jìn)程外)。
實(shí)例
修改myapp.csproj文件:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup> <ItemGroup> </ItemGroup> </Project>
之后重新發(fā)布并部署到IIS,查看網(wǎng)站可以看到:
此時(shí)的進(jìn)程名稱為:dotnet,這是進(jìn)程外托管模式。
HTTP.sys
如果 ASP.NET Core 應(yīng)用在 Windows 上運(yùn)行,則 HTTP.sys 是 Kestrel 的替代選項(xiàng)。 為了獲得最佳性能,通常建議使用 Kestrel。
HTTP.sys僅能在Windows上運(yùn)行,且不能與ASP.NET Core模塊同時(shí)使用。在不想使用IIS或者需要使用Kestrel不具有的功能時(shí)可以使用HTTP.sys。
HTTP.sys 支持以下功能:
- Windows 身份驗(yàn)證
- 端口共享
- 具有 SNI 的 HTTPS
- 基于 TLS 的 HTTP/2(Windows 10 或更高版本)
- 直接文件傳輸
- 響應(yīng)緩存
- WebSocket(Windows 8 或更高版本)
實(shí)例
修改代碼Program.cs如下:
//using Microsoft.AspNetCore.Server.HttpSys; public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.AllowSynchronousIO = true; options.Authentication.Schemes = AuthenticationSchemes.None; options.Authentication.AllowAnonymous = true; options.MaxConnections = null; options.MaxRequestBodySize = 30000000; options.UrlPrefixes.Add("http://localhost:5005"); }); webBuilder.UseStartup<Startup>(); });
在命令行中輸入運(yùn)行應(yīng)用。
dotnet watch run
此時(shí)就是以HTTP.sys方式托管,此時(shí)進(jìn)程名也是myapp。
但是這種方式不能托管在IIS中,如果將發(fā)布的代碼放到IIS中則會(huì)報(bào)錯(cuò)。
總結(jié)
綜上所述,Kestrel是一個(gè)跨平臺(tái)的服務(wù)器,HTTP.sys則只能用于Windows中。Kestrel與HTTP.sys都是嵌入在ASP.NET Core中的服務(wù)器,它們有點(diǎn)類似于SpringBoot中內(nèi)嵌的Tomcat。
即使不使用額外的WEB服務(wù)器,例如IIS,Nginx,Apache等,項(xiàng)目最終生成的文件也可以直接運(yùn)行,并提供HTTP服務(wù),不過,一般推薦的形式是,使用Kestrel作為應(yīng)用服務(wù)器,使用常用的WEB服務(wù)器(Nginx,Apache等)作為反向代理。
在IIS中,官方提供了ASP.NET Core模塊,方便了將ASP.NET Core應(yīng)用托管于IIS中,并提供了兩種模式,其工作方式也類似于反向代理。在Windows中,對(duì)于某些Kestrel不支持的功能,則可以使用HTTP.sys。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net讀取excel中的數(shù)據(jù)并綁定在gridview
這篇文章主要介紹了asp.net讀取excel中的數(shù)據(jù)并綁定在gridview上的方法,需要的朋友可以參考下2014-02-02在ASP.NET中,設(shè)置Session的過期時(shí)間的方法
在ASP.NET中,設(shè)置Session的過期時(shí)間的方法,需要的朋友可以參考下2012-12-12ASP.NET Core 2.0 本地文件操作問題及解決方案
這篇文章主要介紹了ASP.NET Core 2.0 本地文件操作問題及解決方案,需要的朋友可以參考下2017-10-10asp.net生成高質(zhì)量縮略圖通用函數(shù)(c#代碼),支持多種生成方式
這兩天正在研究報(bào)表中餅圖的繪圖方法,文章中的某些做法值得參考.2008-08-08.NET?CORE?鑒權(quán)的實(shí)現(xiàn)示例
本文主要介紹了.NET?CORE?鑒權(quán)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02基于localStorge開發(fā)登錄模塊的記住密碼與自動(dòng)登錄實(shí)例
下面小編就為大家?guī)硪黄趌ocalStorge開發(fā)登錄模塊的記住密碼與自動(dòng)登錄實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08