新建一个空ASP.NET.CORE项目,我这边是建了一个名为WebApplication3的项目
双击项目名,可以看到.csproj文件的内容
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<AspNetCoreHostingModel>OutofProcess</AspNetCoreHostingModel>//注意看这一行
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>f6b80e92-86de-489f-bfb7-d91071f61c12</UserSecretsId>
</PropertyGroup>
</Project>
可以看到注释那一行的内容,其中OutofProcess可以换成InProcess,两者为程序不同的托管形式
InProcess | OutofProcess |
---|---|
InProcess的值指定我们想要使用进程内托管模型 | OutofProcess的值指定我们要使用进程外托管 |
1个web服务器 | 有2个或者1个web服务器-内部Web服务器和外部Web服务器 |
IIS服务器,CreateDefaultBuilder()方法调用UseIIS()方法并在IIS工作进程IIS.exe内托管应用程序 | 内部web服务器为Kestrel,外部Web服务器为IIS,Nginx或者Apache |
下面开始展示如何获取不一样的托管形式
将startup.cs文件中的Configure方法改为如下,这里是为了我们通过返回进程名来判断目前的托管形式
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
var processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
await context.Response.WriteAsync(processName);
});
});
}
下图为IDE中不同的运行方式,一个是IIS Express,一个是WebApplication3(项目名)
通过更换.csproj文件里面的配置和更换运行方式,两两组合,得到四种不一样的结果
当返回iisexpress的时候为进程内托管
当返回WebApplication3为进程外托管
1、IIS Express运行,配置为InProcess,进程内托管,其中iisexpress是在vstudio开发环境下轻量级的iis,将程序交付于其托管
2、WebApplication3运行,配置为OutofProcess,这边是将程序依托给Kestrel进程进行托管,为进程外托管
3、WebApplication3运行,配置为InProcess,这种情况下为自动将InProcess配置忽略掉,等同于注释掉那一行代码,.csproj里面没有配置时,默认为OutOfProcess,此时等同于2的形式
4、IIS Express运行,配置为OutofProcess,进程外托管,这个做了一个反向代理,先是交付于Kestrel进行自己承载自己的请求,然后中间加了一个iis的反向代理,其实本身是进程外托管了,只是中间再加一个反向代理
进程内 | 进程外 |
---|---|
进程名称“iisexpress.exe” | 进程名称“WebApplication.exe” |
另外补充以一个知识点就是,右键项目打开资源管理文件,上面文件路径输入cmd,打开window命令窗口,直接输入dotnet run,可以摆脱编译器运行应用程序