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

时间:2018-06-16 07:17:04

标签: iis asp.net-core visual-studio-2017 application-pool

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

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

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

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

Showing the newly created app pool

1 个答案:

答案 0 :(得分:1)

您所遇到的很可能是.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 的第二台Web服务器运行。 Kestrel轻巧,快速,但缺少成熟Web服务器的许多功能。因此,IIS被用作Kestrel前面的代理,以添加所有更高的功能(如重定向,身份验证等)。您可能会想到,将两个Web服务器级联会降低整体性能并消耗更多资源。

自.NET Core 2.2起,还有另一个选择:进程内托管
如果激活InProcess托管,则IIS将使用IIS的进程内服务器实现IISHttpServer。此实现以及Core应用程序本身与IIS工作进程在同一进程中运行。这样可以减少资源占用并提高性能。
但是有一个限制:ISS中的每个InProcess托管站点都需要一个专用的应用程序池。您不能将同一应用程序池用于为InProcess托管配置的多个站点!
还请记住,此唯一的应用程序池要求对站点的文件夹或应用程序用于读写文件的任何其他文件夹具有读写权限。否则,您将获得503错误。

基本的InProcess配置

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

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

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

更多信息

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