当前位置:主页 > 软件编程 > .NET代码 >

浅谈ASP.NET Core的几种托管方式

时间:2020-11-01 14:42:23 | 栏目:.NET代码 | 点击:

Kestrel

Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器,默认包括在 ASP.NET Core 项目模板中。

Kestrel 支持以下方案:

可以单独使用 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。

在一个目录下打开命令窗口,输入命令:

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" 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 进程内服务器实现,即 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 支持以下功能:

实例

修改代码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。

您可能感兴趣的文章:

相关文章