在 IIS 中托管 .NET 核心 Web 应用程序时,“进程内”和“进程外”托管模型之间的优缺点是什么

joa*_*oar 6 iis backend .net-core

在 IIS 中托管 .NET 核心 Web 应用程序时,您可以在进程内和进程外托管模型之间进行选择。

除了通过使用进程内获得更好的性能外,“进程内”和“进程外”托管模型之间有哪些优缺点?

对于测试/开发与生产,一个比另一个更好吗?

我认为“进程外”托管模型更容易附加调试器。

Bra*_*ang 7

从 ASP.NET Core 3.0 开始,“进行中”是默认设置,请参阅此 Microsoft 页面。在 IIS.ASP.NET Core 上托管 Web 应用程序时,模块会将请求转发到 IIS HTTP 服务器 (IISHttpServer)。IIS HTTP 服务器是与 IIS 一起在进程内运行的服务器。

如果您使用了进程外托管模型,则不会使用 IIS HTTP 服务器。相反,Kestrel Web 服务器用于处理您的请求。

来自瑞克的博客

“进程中”提供了更好的性能,并且通常占用的资源更少,因为它避免了 IIS 和 Kestrel 之间的额外网络跃点,并在需要监视的机器上维护了一个额外的进程。

在某些情况下可能需要 OutOfProcess 托管,例如故障排除和调试失败的服务器(例如,您可以在启用控制台日志记录的情况下运行),或者如果您希望在同一应用程序的不同部署之间 100% 兼容,无论是在 Windows 还是 Linux 上,因为 Kestrel 是用于处理所有平台上的 HTTP 请求的主要机制。

使用 InProcess 模型,您不使用 Kestrel,而是使用直接与 IIS 请求管道接口的自定义 IISHttpServer 实现。

但是对于大多数意图和目的,我认为在 IIS 上运行 InProcess 是可行的方法,除非您有非常特殊的需要需要 Kestrel 和 OutOfProcess 托管。