简介
一个ASP.NET Web 应用程序可以通过两种方式托管,即进程内托管(InProcess)或进程外托管(OutOfProcess)。
要为 ASP.NET Core Web 应用程序配置进程托管模型,只需将AspNetCoreHostingModel元素值添加到应用程序项目文件中即可。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
//配置进程内托管配置
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
//配置进程外托管配置
<!--<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>-->
</PropertyGroup>
</Project>
进程内托管(InProcess)
只有一个Web服务器,在InProcess托管情况下,CreateDefaultBuilder()方法调用UseIIS()方法并在IIS或IIS Express工作进程(w3wp.exe或iisexpress.exe)内托管应用程序。
什么是IIS Express?
IIS Express 是 IIS 的轻量级自包含版本,它针对 Web 应用程序开发进行了优化,仅在开发中使用 IIS Express,在生产中通常使用 IIS。
进程外托管(OutOfProcess)
有两个Web服务器,内部Web服务器和外部Web服务器。内部Web服务器Kestrel也是自宿主服务器,外部Web服务器可以是IlS, Nginx或Apache等做代理服务器。
什么是Kestrel Web 服务器?
ASP.NET Core是一个跨平台框架。 这意味着它支持在不同类型的操作系统(例如Windows,Linux或Mac)上开发和运行应用程序。Kestrel是ASP.NET Core应用程序的跨平台Web服务器。 这意味着该服务器支持ASP.NET Core支持的所有平台和版本。 默认情况下,它包含在.NET Core应用程序中作为内部Web服务器。Kestrel Web服务器通常用作边缘服务器,即面向Internet的Web服务器,它直接处理来自客户端的传入HTTP请求。 对于Kestrel Web服务器,用于承载和运行ASP.NET Core应用程序的进程名称是项目名称。
Kestrel可以用作面向互联网的Web服务器,直接处理传入的HTTP请求。此模型中,我们不使用外部Web服务器,而是只使用Kestrel,它作为服务器自主面向互联网,直接处理传入的HTTP请求。当我们使用.Net Core CLI运行Asp.Net Core运行程序时忽略InProcess配置,Kestrel是唯一用于处理传入HTTP请求的Web服务器,默认进程外托管。
Kestrel与反向代理服务器(如IIS、Apache或Nginx)结和使用
反向代理服务器
Kestrel可以单独用作Web服务器,为什么还需要反向代理服务器?
如果Kestrel使用进程外托管,则结和反向代理服务器是一个不错的选择,因为它提供了额外的的配置和安全性,可以更好的与现有基础设施集成,同时还可以用于负载均衡。
因此,在使用反向代理服务器的情况下,它将接收来自网络的HTTP请求并将其转发到Kestrel服务器进行代理。在处理请求时,Kestrel服务器将响应发送到反向代理服务器,然后反向代理服务器通过网络将响应发送到请求的客户端。
进程内(InProcess)和进程外(OutOfProcess)托管对比
进程内 | 进程外 |
---|---|
进程名称“w3wp.exe”或“iisexpress.exe” | 进程名称“项目名称.exe” |
一个服务器 | 两个服务器 |
性能更好 | 在内部和外部服务器之间代理请求有性能消耗 |
总结
- InProcess表示要使用进程内托管模型,即在IIS工作进程(w3wp.exe)中托管Asp.Net Core应用程序
- OutOfProcess表示使用进程外托管模型,将Web请求转发到Kestrel服务器的后端Asp.Net Core应用程序中。
- Asp.Net Core3.x,默认AspNetCoreHostingModel隐式声明进程内托管。
- Kestrel不与进程内托管一起使用(使用项目名启动应用则会忽略InProcess配置使用进程外托管)。