淺談ASP.NET Core的幾種托管方式

 更新時間:2019年12月11日 10:14:55   作者:cag   我要評論
這篇文章主要介紹了淺談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  rel="external nofollow" >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。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

湖北11选5走势图爱彩乐 太仓东莞市股服务 配资平台173bx 融金牛配资 盛鑫配资 点点金配资 000026股票行情 私募基金配资模式 汇盈盘配资 2013年股票推荐 今日黑马股票推荐 股票指数基金怎么买卖 熊猫配资 股票行情大盘走势 股市行情分析软件 在线股票配资平台 中国股票指数多少点