溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

ASP.NET Core中有哪些托管方式

發(fā)布時(shí)間:2021-06-11 14:32:58 來(lái)源:億速云 閱讀:65 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

ASP.NET Core中有哪些托管方式?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

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ù)器接收來(lái)自網(wǎng)絡(luò)的 HTTP 請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)發(fā)到 Kestrel。

Kestrel 用作邊緣(面向 Internet)Web 服務(wù)器:

ASP.NET Core中有哪些托管方式

Kestrel 用于反向代理配置:

ASP.NET Core中有哪些托管方式

實(shí)例

為了看起來(lái)更加簡(jiǎn)單直接,這里我們使用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è)目錄下打開(kāi)命令窗口,輸入命令:

dotnet new webapp -o myapp

這樣,就使用默認(rèn)模板新建了一個(gè)項(xiàng)目。如果是首次安裝使用.NET Core,還需要信任證書(shū):

dotnet dev-certs https --trust

此時(shí),這個(gè)項(xiàng)目可以直接運(yùn)行:

cd myapp
dotnet watch run

此時(shí)就是以?xún)?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">
 <h2 class="display-4">Welcome</h2>
 <p>
  "@Process.GetCurrentProcess().ProcessName"
 </p>
 <p>Learn about <a href="https://docs.microsoft.com/aspnet/core" rel="external nofollow" >building Web apps with ASP.NET Core</a>.</p>
</div>

運(yùn)行程序我們看到:

ASP.NET Core中有哪些托管方式

此時(shí)的進(jìn)程名稱(chēng)就是我們的應(yīng)用名稱(chēng)。接下來(lái)我們以這個(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)用,稱(chēng)為進(jìn)程內(nèi)托管模型。

  • 將 Web 請(qǐng)求轉(zhuǎn)發(fā)到運(yùn)行 Kestrel 服務(wù)器的后端 ASP.NET Core 應(yīng)用,稱(chē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。 該模塊無(wú)法與 HTTP.sys 一起工作。

進(jìn)程內(nèi)托管

ASP.NET Core中有哪些托管方式

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

接下來(lái)將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)站可以看到:

ASP.NET Core中有哪些托管方式

此時(shí)進(jìn)程名稱(chēng)為:w3wp。這就是默認(rèn)的進(jìn)程內(nèi)托管模式。

進(jìn)程外托管

ASP.NET Core中有哪些托管方式

進(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)站可以看到:

ASP.NET Core中有哪些托管方式

此時(shí)的進(jìn)程名稱(chēng)為: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 或更高版本)

ASP.NET Core中有哪些托管方式

實(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。

ASP.NET Core中有哪些托管方式

但是這種方式不能托管在IIS中,如果將發(fā)布的代碼放到IIS中則會(huì)報(bào)錯(cuò)。

ASP.NET Core中有哪些托管方式

關(guān)于ASP.NET Core中有哪些托管方式問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI