如何使 IIS 忽略应用程序中 ASP Net Core Host 的两个实例之一?

How to make IIS ignore one of two instances of ASP Net Core Host in the application?

我在单个应用程序的两个不同端口上有两个 ASP 网络核心主机实例:

  1. 正常的 WebHost 服务于外部客户端的请求。
  2. 内部 gRPC 主机,用于与内部网络上的应用程序的其他实例和组件进行通信。

当应用程序是自托管时,这会按预期工作。然而,当应用程序由 IIS 托管时,所有请求最终都由第二个主机处理,并且尝试与第一个主机通信的客户端总是收到 404。gRPC 通信仍然正常工作(看起来第二个主机是唯一的一个功能)。

当我试图将应用程序从本机 gRPC.Core 服务器迁移到较新的 Grpc.AspNetCore 包时,整个情况就出现了。我们需要将两个主机分开的原因有很多 - 它们由应用程序的完全不同部分拥有,具有不同的生命周期并且具有截然不同的策略。

是否可以让 IIS 完全忽略 gRPC 主机? 它根本不需要 IIS 的功能——理想情况下它会继续完全由后台控制——结束时使用 Grpc.Core 服务器。

我最终设法解决了这个问题 - Kestrel 主机不会自行注册到 IIS,但大多数示例中使用的 ConfigureWebHostDefaults 扩展方法都会这样做,如 the documentation 中所述:

The ConfigureWebHostDefaults method:

Loads host configuration from environment variables prefixed with ASPNETCORE_.

Sets Kestrel server as the web server and configures it using the app's hosting configuration providers. For the Kestrel server's default options, see Configure options for the ASP.NET Core Kestrel web server.

Adds Host Filtering middleware. Adds Forwarded Headers middleware if ASPNETCORE_FORWARDEDHEADERS_ENABLED equals true.

Enables IIS integration. For the IIS default options, see Host ASP.NET Core on Windows with IIS.

解决方案是改用 ConfigureWebHost 扩展方法并手动进行必要的初始化 - 我不得不调用 UseKestrel 并手动配置日志记录。我建议查看 ConfigureWebHostDefaults 的 implementation 以了解它究竟初始化了什么。