使用 VS2017 启动 asp.net 核心应用程序会创建新的应用程序池

Launching a asp.net core app using VS2017 creates new Application Pool

每次我在 VS2017 的本地 IIS 下为 ASP.net 核心应用程序启动调试器时,都会创建一个新的应用程序池。

我希望应用程序在 DefaultAppPool 'Identity' 下保持稳定,而不是创建一个新的。

这个设置在哪里影响这个?

我可以使用 IIS 管理控制台手动将其设置为旧值,但它越来越烦人。

您遇到的问题很可能是 .NET Core 2.2 引入的新 InProcess 托管模型的副作用。检查您的 .csproj 文件是否有此行:

<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

InProcess 托管只允许每个应用程序池有一个 IIS 站点。如果不满足此条件,它将即时生成新的应用程序池。

您可以 return 到旧的 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 上的所有核心 Web 应用程序都 运行 使用名为 Kestrel 的第二个 Web 服务器。 Kestrel 轻量级且速度快,但缺少成熟 Web 服务器的许多功能。因此,IIS 被用作 Kestrel 前面的代理,以添加所有更高的功能(如重定向、身份验证等)。正如您所想象的那样,级联两个 Web 服务器会降低整体性能并消耗额外的资源。

从 .NET Core 2.2 开始还有另一个选项:InProcess hosting
如果激活 InProcess 托管,IIS 将使用名为 IISHttpServer 的 IIS 进程内服务器实现。此实现以及核心应用程序本身 运行 在与 IIS 工作进程相同的进程中。这减少了资源占用并提高了性能。
但是有一个限制:ISS 中的每个 InProcess 托管站点都需要一个专用的应用程序池。您不能对为 InProcess 托管配置的多个站点使用同一个应用程序池!
另请记住,这个独特的应用程序池需要对站点文件夹或应用程序读取和写入文件的任何其他文件夹的读写访问权限。否则你会得到 503 错误。

基本 InProcess 配置

InProcess 项目的 .csproj 中的典型 PropertyGroup 条目如下所示:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

您只需将 InProcess 更改为 OutOfProcess 即可轻松地在新 InProcess 和旧 Kestrel 托管之间来回切换,反之亦然。

更多信息

有关 InProcess 托管的更多信息,请参阅:ASP.NET Core Hosting Models
有关将现有核心项目迁移到 InProcess 托管的信息,请参阅:Adopt the IIS in-process hosting model