浅谈ASP.NET Core的几种托管方式
Kestrel
Kestrel是一个跨平台的适用于ASP.NETCore的Web服务器,默认包括在ASP.NETCore项目模板中。
Kestrel支持以下方案:
- HTTPS
- 用于启用WebSocket的不透明升级
- 用于获得Nginx高性能的Unix套接字
- HTTP/2(除macOS†以外)
可以单独使用Kestrel,也可以将其与反向代理服务器(如InternetInformationServices(IIS)、Nginx或Apache)结合使用。反向代理服务器接收来自网络的HTTP请求,并将这些请求转发到Kestrel。
Kestrel用作边缘(面向Internet)Web服务器:
Kestrel用于反向代理配置:
实例
为了看起来更加简单直接,这里我们使用VSCode新建一个ASP.NETCore的Web应用,并使用Kestrel作为服务器。
首先需要在计算机上安装.NETCore环境。这里可以查看官网。本例中使用的是.NETCore3.1。
- 新建APS.NETCoreWeb应用
在一个目录下打开命令窗口,输入命令:
dotnetnewwebapp-omyapp
这样,就使用默认模板新建了一个项目。如果是首次安装使用.NETCore,还需要信任证书:
dotnetdev-certshttps--trust
此时,这个项目可以直接运行:
cdmyapp dotnetwatchrun
此时就是以内置的Kestrel作为服务器直接运行的。我们修改一下代码,查看一下运行时的进程,修改Pages/Index.cshtml如下:
@page @usingSystem.Diagnostics @modelIndexModel @{ ViewData["Title"]="Homepage"; }Welcome "@Process.GetCurrentProcess().ProcessName"
Learnabout
buildingWebappswithASP.NETCore.
运行程序我们看到:
此时的进程名称就是我们的应用名称。接下来我们以这个代码为基础,分别看看其他托管模式中的情况。
IIS
在IIS中托管ASP.NETCore应用需要ASP.NETCore模块。
ASP.NETCore模块是插入IIS管道的本机IIS模块,用于:
- 在IIS工作进程(w3wp.exe)内托管ASP.NETCore应用,称为进程内托管模型。
- 将Web请求转发到运行Kestrel服务器的后端ASP.NETCore应用,称为进程外托管模型。
在进程内托管时,该模块会使用IIS进程内服务器实现,即IISHTTP服务器(IISHttpServer)。
在进程外托管时,该模块仅适用于Kestrel。该模块无法与HTTP.sys一起工作。
进程内托管
ASP.NETCore应用默认为进程内托管模型。在进程内托管时,使用IISHTTP服务器(IISHttpServer)而不是Kestrel服务器。
实例
代码还是与之前相同的代码,首先将代码发布一下:
dotnetpublish--configurationRelease
接下来将publish文件夹中的文件托管到IIS中。
要在IIS中托管ASP.NETCore网站,首先要安装.NETCore托管捆绑包安装程序,安装后重启电脑或在命令行中执行:
netstopwas/y
之后执行:
netstartw3svc
然后在IIS中新建网站,并将根目录指向上一步中的publish文件夹,浏览网站可以看到:
此时进程名称为:w3wp。这就是默认的进程内托管模式。
进程外托管
进程外托管使用Kestrel服务器,而不是IISHTTP服务器(IISHttpServer)。
若要配置进程外托管应用,请在项目文件(.csproj)中将属性的值设置为OutOfProcess:
OutOfProcess
Process.GetCurrentProcess().ProcessName报告w3wp/iisexpress(进程内)或dotnet(进程外)。
实例
修改myapp.csproj文件:
netcoreapp3.0 OutOfProcess
之后重新发布并部署到IIS,查看网站可以看到:
此时的进程名称为:dotnet,这是进程外托管模式。
HTTP.sys
如果ASP.NETCore应用在Windows上运行,则HTTP.sys是Kestrel的替代选项。为了获得最佳性能,通常建议使用Kestrel。
HTTP.sys仅能在Windows上运行,且不能与ASP.NETCore模块同时使用。在不想使用IIS或者需要使用Kestrel不具有的功能时可以使用HTTP.sys。
HTTP.sys支持以下功能:
- Windows身份验证
- 端口共享
- 具有SNI的HTTPS
- 基于TLS的HTTP/2(Windows10或更高版本)
- 直接文件传输
- 响应缓存
- WebSocket(Windows8或更高版本)
实例
修改代码Program.cs如下:
//usingMicrosoft.AspNetCore.Server.HttpSys; publicstaticIHostBuilderCreateHostBuilder(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(); });
在命令行中输入运行应用。
dotnetwatchrun
此时就是以HTTP.sys方式托管,此时进程名也是myapp。
但是这种方式不能托管在IIS中,如果将发布的代码放到IIS中则会报错。
综上所述,Kestrel是一个跨平台的服务器,HTTP.sys则只能用于Windows中。Kestrel与HTTP.sys都是嵌入在ASP.NETCore中的服务器,它们有点类似于SpringBoot中内嵌的Tomcat。
即使不使用额外的WEB服务器,例如IIS,Nginx,Apache等,项目最终生成的文件也可以直接运行,并提供HTTP服务,不过,一般推荐的形式是,使用Kestrel作为应用服务器,使用常用的WEB服务器(Nginx,Apache等)作为反向代理。
在IIS中,官方提供了ASP.NETCore模块,方便了将ASP.NETCore应用托管于IIS中,并提供了两种模式,其工作方式也类似于反向代理。在Windows中,对于某些Kestrel不支持的功能,则可以使用HTTP.sys。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。