您遇到的情况很可能是 .NET Core 2.2 中引入的新 InProcess 托管模型的副作用。检查 .csproj 文件中的这一行:
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
InProcess 托管仅允许每个应用程序池有一个 IIS 站点。如果不满足此条件,它将动态生成新的应用程序池。
您可以通过删除上面的行或将其更改为以下内容来返回旧的 Kestrel 托管:
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
In- 和 OutOfProcess 托管之间的差异也反映在 web.config 中,因此如果您想返回,可能也必须在那里进行更改。在system.webServer中查找aspNetCore节点:
<aspNetCore
processPath="..."
arguments="..."
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="InProcess"
>
同样,您可以删除 HostingModel 条目或将其值更改为“OutOfProcess”:
<aspNetCore
...
hostingModel="OutOfProcess"
>
可是等等!
您可能实际上想要重新考虑并采用新的 InProcess 模型,原因如下所述。
新的 InProcess 托管与旧的 Kestrel 托管
在 .NET Core 2.2 之前,IIS 上的所有 Core Web 应用程序都使用名为Kestrel。 Kestrel 轻量且速度快,但缺乏成熟 Web 服务器的许多功能。因此,IIS 被用作 Kestrel 前面的代理来添加所有更高的功能(如重定向、身份验证等)。正如您所想象的,级联两个 Web 服务器会降低整体性能并消耗额外的资源。
从 .NET Core 2.2 开始,还有另一种选择:进程内托管
如果激活进程内托管,IIS 将使用名为 IISHttpServer 的 IIS 进程内服务器实现。此实现以及核心应用程序本身与 IIS 工作进程在同一进程中运行。这减少了资源占用并提高了性能。
但有一个限制:ISS 中的每个 InProcess 托管站点都需要一个专用的应用程序池。您不能将同一个应用程序池用于配置为进程内托管的多个站点!
另请记住,这个独特的应用程序池需要对站点文件夹或应用程序读取和写入文件的任何其他文件夹具有读写访问权限。否则你会得到 503 错误。
基本进程内配置
InProcess 项目的 .csproj 中的典型 PropertyGroup 条目如下所示:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
您只需更改即可轻松地在新的 InProcess 和旧的 Kestrel 托管之间来回切换InProcess
to OutOfProcess
反之亦然。
更多信息
有关进程内托管的更多信息,请参阅:ASP.NET Core 托管模型 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/index?view=aspnetcore-3.0#hosting-models
有关将现有 Core 项目迁移到 InProcess 托管的信息,请参阅: