在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
请发表评论