淺談ASP.NET Core的幾種托管方式
Kestrel
Kestrel 是一個跨平臺的適用于 ASP.NET Core 的 Web 服務(wù)器,默認(rèn)包括在 ASP.NET Core 項目模板中。
Kestrel 支持以下方案:
- HTTPS
- 用于啟用 WebSocket 的不透明升級
- 用于獲得 Nginx 高性能的 Unix 套接字
- HTTP/2(除 macOS† 以外)
可以單獨使用 Kestrel,也可以將其與反向代理服務(wù)器 (如 Internet Information Services (IIS)、Nginx 或 Apache)結(jié)合使用。 反向代理服務(wù)器接收來自網(wǎng)絡(luò)的 HTTP 請求,并將這些請求轉(zhuǎn)發(fā)到 Kestrel。
Kestrel 用作邊緣(面向 Internet)Web 服務(wù)器:
Kestrel 用于反向代理配置:
實例
為了看起來更加簡單直接,這里我們使用VS Code新建一個ASP.NET Core的Web應(yīng)用,并使用Kestrel作為服務(wù)器。
首先需要在計算機(jī)上安裝.NET Core環(huán)境。這里可以查看 官網(wǎng) 。本例中使用的是.NET Core 3.1。
- 新建APS.NET Core Web應(yīng)用
在一個目錄下打開命令窗口,輸入命令:
dotnet new webapp -o myapp
這樣,就使用默認(rèn)模板新建了一個項目。如果是首次安裝使用.NET Core,還需要信任證書:
dotnet dev-certs https --trust
此時,這個項目可以直接運行:
cd myapp dotnet watch run
此時就是以內(nèi)置的Kestrel作為服務(wù)器直接運行的。我們修改一下代碼,查看一下運行時的進(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>
運行程序我們看到:
此時的進(jìn)程名稱就是我們的應(yīng)用名稱。接下來我們以這個代碼為基礎(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 請求轉(zhuǎn)發(fā)到運行 Kestrel 服務(wù)器的后端 ASP.NET Core 應(yīng)用,稱為進(jìn)程外托管模型。
在進(jìn)程內(nèi)托管時,該模塊會使用 IIS 進(jìn)程內(nèi)服務(wù)器實現(xiàn),即 IIS HTTP 服務(wù)器 (IISHttpServer)。
在進(jìn)程外托管時,該模塊僅適用于 Kestrel。 該模塊無法與 HTTP.sys 一起工作。
進(jìn)程內(nèi)托管
ASP.NET Core 應(yīng)用默認(rèn)為進(jìn)程內(nèi)托管模型。在進(jìn)程內(nèi)托管時,使用 IIS HTTP 服務(wù)器 (IISHttpServer) 而不是 Kestrel 服務(wù)器。
實例
代碼還是與之前相同的代碼,首先將代碼發(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)站可以看到:
此時進(jìn)程名稱為:w3wp。這就是默認(rèn)的進(jìn)程內(nèi)托管模式。
進(jìn)程外托管
進(jìn)程外托管使用 Kestrel 服務(wù)器,而不是 IIS HTTP 服務(wù)器 (IISHttpServer)。
若要配置進(jìn)程外托管應(yīng)用,請在項目文件 ( .csproj) 中將 屬性的值設(shè)置為 OutOfProcess:
<PropertyGroup> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup>
Process.GetCurrentProcess().ProcessName 報告w3wp/iisexpress(進(jìn)程內(nèi))或 dotnet(進(jìn)程外)。
實例
修改myapp.csproj文件:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup> <ItemGroup> </ItemGroup> </Project>
之后重新發(fā)布并部署到IIS,查看網(wǎng)站可以看到:
此時的進(jìn)程名稱為:dotnet,這是進(jìn)程外托管模式。
HTTP.sys
如果 ASP.NET Core 應(yīng)用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。 為了獲得最佳性能,通常建議使用 Kestrel。
HTTP.sys僅能在Windows上運行,且不能與ASP.NET Core模塊同時使用。在不想使用IIS或者需要使用Kestrel不具有的功能時可以使用HTTP.sys。
HTTP.sys 支持以下功能:
- Windows 身份驗證
- 端口共享
- 具有 SNI 的 HTTPS
- 基于 TLS 的 HTTP/2(Windows 10 或更高版本)
- 直接文件傳輸
- 響應(yīng)緩存
- WebSocket(Windows 8 或更高版本)
實例
修改代碼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īng)用。
dotnet watch run
此時就是以HTTP.sys方式托管,此時進(jìn)程名也是myapp。
但是這種方式不能托管在IIS中,如果將發(fā)布的代碼放到IIS中則會報錯。
總結(jié)
綜上所述,Kestrel是一個跨平臺的服務(wù)器,HTTP.sys則只能用于Windows中。Kestrel與HTTP.sys都是嵌入在ASP.NET Core中的服務(wù)器,它們有點類似于SpringBoot中內(nèi)嵌的Tomcat。
即使不使用額外的WEB服務(wù)器,例如IIS,Nginx,Apache等,項目最終生成的文件也可以直接運行,并提供HTTP服務(wù),不過,一般推薦的形式是,使用Kestrel作為應(yīng)用服務(wù)器,使用常用的WEB服務(wù)器(Nginx,Apache等)作為反向代理。
在IIS中,官方提供了ASP.NET Core模塊,方便了將ASP.NET Core應(yīng)用托管于IIS中,并提供了兩種模式,其工作方式也類似于反向代理。在Windows中,對于某些Kestrel不支持的功能,則可以使用HTTP.sys。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Asp.Net Core使用swagger生成api文檔的完整步驟
欄 目:ASP.NET
本文標(biāo)題:淺談ASP.NET Core的幾種托管方式
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10838.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲過程的方式
- 01-11asp.net Core3.0區(qū)域與路由配置的方法


閱讀排行
本欄相關(guān)
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載