时间: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。