.NET Core 3 - IIS - 应用程序初始化不起作用

Cor*_*te5 6 iis background-process asp.net-core asp.net-core-3.0

我一直在关注IHostedService文档,以便使用 .NET Core MVC 框架运行后台任务。

我希望该服务在 IIS 中自动启动,但是,它不起作用。

我做了以下工作:

  • Windows Server 上已安装的应用程序初始化功能
  • 在网站上将“预加载”设置为 true
  • 在 AppPool 上,设置“AlwaysRunning”
  • 在 AppPool 上,将“空闲超时”设置为 0
  • 在 AppPool 上,确保它在“无托管代码”下运行
  • 在 ApplicationInitialization 配置中,设置以下标志:
  • doAppInitAfterRestart = True
  • 跳过管理模块 = False
  • 添加了一个初始化页面键,=“/start”(一个空白的 MVC 调用只是为了启动应用程序)

奇怪的是,这些步骤适用于全新的 Windows Server 安装,但不适用于我想要使用的服务器。

在有问题的服务器上,我可以看到 w3wp 进程尝试启动 dotnet 进程(通过 Procmon),但它实际上并没有运行任何 dotnet 核心代码,直到我从浏览器发送一个真正的 HTTP 请求。

我已经阅读了许多 GitHub 线程,它们说无论确切的 IIS 版本如何,这都应该可以工作——还有什么可能发生?

Cor*_*te5 2

编辑 2022:看起来以下仍然有效,但间歇性失败。正确的解决方案如上所述 - 您还需要在 IIS 站点的身份验证中启用“匿名身份验证” 。

Windows 身份验证仍然可以并行启用,.NET Core 允许您至少在程序启动后控制身份验证模式。

这似乎允许 IIS COM 进程访问一个未知文件,该文件最终通过运行应用程序池的帐户传递 - 看来 AppInit 是在进程外针对此初始请求进行操作的(因此可能是某些本地帐户或虚拟临时帐户) 。

我发现 .NET Core 的 GC 设置对于这个特定问题没有影响。


我为此付出了极大的努力,包括取消注册全局模块、手动修改 DLL、更改 applicationHost.config 以及清除各种内部 IIS 配置。没有一个能让应用程序自动启动。

然后我采取了核心方法:重新安装 IIS(在卸载/重新安装之间重新启动)

这当然意味着丢失有关现有托管应用程序的一些信息(例如绑定信息 - 如果您在重新安装后看到所有站点都“已停止”,那是因为不再附加绑定),并且在重新安装后我还必须:

  • 重新安装/修复 Web Deploy 3.5

  • 重新安装/修复 ASP.NET Core 托管捆绑包(对于每个受影响的版本)

  • 重新安装/修复 .NET Core SDK

然后一切开始按预期进行。我的大部分 IIS 站点和设置都保持不变。我不需要像其他帖子中常见的那样重新安装 WAS(激活服务)。


更新:我遇到过 AppInit 在某些服务器上停止工作的情况,即使使用上述步骤临时解决它之后 - 我在这里打开了一个错误: https: //github.com/dotnet/aspnetcore/issues/19509