浅谈ASP.NET Core的几种托管方式 |
本文标签:ASP.NET,Core,托管 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 。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家 。 |