首页 > 解决方案 > IIS 的 AspNetCoreModule 模块实现了什么?

问题描述

在 IIS 中托管 ASP.NET Core 网站时,我们需要安装ASP.NET Core 托管包,而不管将网站编译为自包含程序集(包括框架和运行时库)。

在进程外运行(IIS 将所有请求转发到 Kestrel)时,此要求不会改变。

AspNetCoreModuleV2 模块实现了什么?有没有其他选择(除了不在 IIS 中运行)?

标签: asp.net-coreiis

解决方案


正如文档所解释的

ASP.NET Core 模块是插入 IIS 管道的本机 IIS 模块,允许 ASP.NET Core 应用程序与 IIS 一起工作。通过 IIS 运行 ASP.NET Core 应用程序:

  • 在 IIS 工作进程 (w3wp.exe) 中托管 ASP.NET Core 应用程序,称为进程内托管模型
  • 将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用程序,称为进程外托管模型

因此,根据您的托管模型,模块的运行方式会略有不同,但最终它仍然会做同样的事情:它将允许 IIS 直接托管您的 ASP.NET Core 应用程序。之所以需要这样做,是因为 IIS 本身具有一种特殊的托管网站和处理请求的方式,这种方式非常特定于经典 ASP.NET 的工作方式。

但由于 ASP.NET Core 既不使用 .NET Framework 运行时,也不利用经典的 ASP.NET 应用程序模型,因此需要有“某种东西”来阻止 IIS 将默认的 ASP.NET 管道应用到 ASP.NET Core 应用程序。这就是 ASP.NET Core IIS 模块的工作。

安装该模块基本上会将两个托管模型的功能添加到 IIS,然后可以通过web.configASP.NET Core 将为您生成的激活。

如果您想通过 IIS 托管您的 ASP.NET Core 应用程序,那么实际上无法安装某些模块。ASP.NET Core 模块是将应用程序正确集成到 IIS 的最佳方式。如果您不想使用 ASP.NET Core 模块,那么您也可以将应用程序直接托管在 Kestrel 上,例如作为 Windows 服务,然后将 IIS 配置为您的 ASP.NET Core 应用程序的完整反向代理。但是,为了做到这一点,您将需要使用 Application Request Routing 模块(及其依赖项URL Rewrite),因为 IIS 没有开箱即用的反向代理功能。

关于 ASP.NET Core 模块的最后一点说明:该模块实际上只包含 IIS 托管应用程序所需的位。它对应用程序代码没有影响,您仍然需要单独安装 .NET Core 运行时‡</sup>,或者将您的应用程序部署为独立的应用程序。但是,您不需要定期更新托管模块,因为更改很少。所以通常情况下,它是你安装一次然后停止思考的东西。


‡ .NET Core 运行时默认包含在托管模块中,但您也可以单独安装托管模块该模块不到 2 MiB。


推荐阅读