1. 程式人生 > 程式設計 >ASP.NET Core的幾種託管方式

ASP.NET Core的幾種託管方式

Kestrel

Kestrel 是一個跨平臺的適用於 ASP.NET Core 的 Web 伺服器,預設包括在 ASP.NET Core 專案模板中。

Kestrel 支援以下方案:

  • HTTPS
  • 用於啟用 WebSocket 的不透明升級
  • 用於獲得 Nginx 高效能的 Unix 套接字
  • HTTP/2(除 macOS† 以外)

可以單獨使用 Kestrel,也可以將其與反向代理伺服器 (如 Internet Information Services (IIS)、Nginx 或 Apache)結合使用。 反向代理伺服器接收來自網路的 HTTP 請求,並將這些請求轉發到 Kestrel。

Kestrel 用作邊緣(面向 Internet)Web 伺服器:

Kestrel 用於反向代理配置:

例項

為了看起來更加簡單直接,這裡我們使用VS Code新建一個ASP.NET Core的Web應用,並使用Kestrel作為伺服器。

首先需要在計算機上安裝.NET Core環境。這裡可以檢視官網。本例中使用的是.NET Core 3.1。

  • 新建APS.NET Core Web應用

在一個目錄下開啟命令視窗,輸入命令:

dotnet new webapp -o myapp
複製程式碼

這樣,就使用預設模板新建了一個專案。如果是首次安裝使用.NET Core,還需要信任證書:

dotnet dev-certs https --trust
複製程式碼

此時,這個專案可以直接執行:

cd myapp
dotnet watch run
複製程式碼

此時就是以內建的Kestrel作為伺服器直接執行的。我們修改一下程式碼,檢視一下執行時的程式,修改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 href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
複製程式碼

執行程式我們看到:

此時的程式名稱就是我們的應用名稱。接下來我們以這個程式碼為基礎,分別看看其他託管模式中的情況。

IIS

在IIS中託管ASP.NET Core應用需要ASP.NET Core 模組。

ASP.NET Core 模組是插入 IIS 管道的本機 IIS 模組,用於:

  • 在 IIS 工作程式 (w3wp.exe) 內託管 ASP.NET Core 應用,稱為程式內託管模型。
  • 將 Web 請求轉發到執行 Kestrel 伺服器的後端 ASP.NET Core 應用,稱為程式外託管模型。

在程式內託管時,該模組會使用 IIS 程式內伺服器實現,即 IIS HTTP 伺服器 (IISHttpServer)。

在程式外託管時,該模組僅適用於 Kestrel。 該模組無法與 HTTP.sys 一起工作。

程式內託管

ASP.NET Core 應用預設為程式內託管模型。在程式內託管時,使用 IIS HTTP 伺服器 (IISHttpServer) 而不是 Kestrel 伺服器。

例項

程式碼還是與之前相同的程式碼,首先將程式碼釋出一下:

dotnet publish --configuration Release
複製程式碼

接下來將publish資料夾中的檔案託管到IIS中。

要在IIS中託管ASP.NET Core網站,首先要安裝.NET Core 託管捆綁包安裝程式,安裝後重啟電腦或在命令列中執行:

 net stop was /y
複製程式碼

之後執行:

net start w3svc
複製程式碼

然後在IIS中新建網站,並將根目錄指向上一步中的publish資料夾,瀏覽網站可以看到:

此時程式名稱為:w3wp。這就是預設的程式內託管模式。

程式外託管

程式外託管使用 Kestrel 伺服器,而不是 IIS HTTP 伺服器 (IISHttpServer)。

若要配置程式外託管應用,請在專案檔案 ( .csproj) 中將 屬性的值設定為 OutOfProcess:

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>
複製程式碼

Process.GetCurrentProcess().ProcessName 報告w3wp/iisexpress(程式內)或 dotnet(程式外)。

例項

修改myapp.csproj檔案:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>
  <ItemGroup>
  </ItemGroup>
</Project>
複製程式碼

之後重新發布並部署到IIS,檢視網站可以看到:

此時的程式名稱為:dotnet,這是程式外託管模式。

HTTP.sys

如果 ASP.NET Core 應用在 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 或更高版本)
  • 直接檔案傳輸
  • 響應快取
  • 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>();
                });
複製程式碼

在命令列中輸入執行應用。

dotnet watch run
複製程式碼

此時就是以HTTP.sys方式託管,此時程式名也是myapp。

但是這種方式不能託管在IIS中,如果將釋出的程式碼放到IIS中則會報錯。

總結

綜上所述,Kestrel是一個跨平臺的伺服器,HTTP.sys則只能用於Windows中。Kestrel與HTTP.sys都是嵌入在ASP.NET Core中的伺服器,它們有點類似於SpringBoot中內嵌的Tomcat。

即使不使用額外的WEB伺服器,例如IIS,Nginx,Apache等,專案最終生成的檔案也可以直接執行,並提供HTTP服務,不過,一般推薦的形式是,使用Kestrel作為應用伺服器,使用常用的WEB伺服器(Nginx,Apache等)作為反向代理。

在IIS中,官方提供了ASP.NET Core模組,方便了將ASP.NET Core應用託管於IIS中,並提供了兩種模式,其工作方式也類似於反向代理。在Windows中,對於某些Kestrel不支援的功能,則可以使用HTTP.sys。