Windows Server 2016 中的 IIS - 应用程序不总是运行,不会立即启动,并且会启动两次。

7
我有一个运行在Windows Server 2016上的Wep API .NET Core应用程序,通过IIS运行。该应用程序不仅仅是回复其API,还会监控其他服务的事件等。
我有三个问题: 1. 当我通过IIS启动/重启应用程序(或发布更新)时,它不会做任何事情,直到有请求到来才会启动应用程序。有没有办法强制应用程序立即运行? 2. 应用程序进行了大量的后台处理,但有时会完全停止。它有定时器任务未被执行等。如果我不断地向记录器输出工作,就不会发生这种情况。 3. 当应用程序启动时,它会将相当多的信息发送到日志,并且在此期间,我可以看到它启动两次!它开始显示一页日志,然后再次启动。但是奇怪的是:当应用程序启动时,选择一个随机的“可爱名称”以便我们区分实例,并且在原始启动和第二个启动期间,它是相同的名称,因此显示它是同一实例,但是初始化被调用了第二次。
有没有关于在IIS容器中运行应用程序的特定信息,可以解释这些行为?
更多搜索后,推荐的选项是运行为服务,但在我的情况下不可能,所以我仍然需要创建一个带有IIS反向代理的.Net Core Kestrel应用程序。
尽管下面有评论,但我仍然找不到任何好的解决方案,除了定期ping该站点以保持其运行。

每个问题都已经讨论了无数次,所以请做好功课阅读现有的讨论。1)这是默认的IIS行为,如何更改请聪明地使用Google。2)在IIS上停止在Web应用程序中执行此操作,Google应该会告诉您替代方案。3)这实际上取决于您记录“开始”信息的位置。如果您恰好选择了管道中的特定位置,我不会感到惊讶看到某些事情发生两次。 - Lex Li
对于1),有数百万篇与旧版本ASP相关的帖子,讲述如何在web.config中添加内容等,这些都与我的情况(或者说我的ASP版本)无关。至于2),我已经搜索过了,没有找到合适的替代方案(因为我需要一个不包含任何ASP依赖代码的解决方案,因为代码库是与非Web相关的东西共享的)。至于3),记录器实际上是整个应用程序中初始化的第一件事,并且它是单例的。 - Thomas
从我所看到的情况来看,截至 .Net Core 2,这仍然不可行。虽然有 Github 问题报告,但我并没有看到任何解决方案,只有关于为什么它无法工作的长时间辩论。 - runxc1 Bret Ferrier
2个回答

4
在应用程序池中将“启动模式”设置为“始终运行”,在网站本身上将“预加载启用”设置为“true”。有了这两个设置,应用程序可以立即启动。
编辑:您必须在IIS上启用“应用程序初始化”模块。

2
我在WS2016上完成了这个操作,它只会在第一个查询时开始执行。 - Thomas
好的,我之前也遇到过类似的问题,但是在不同的服务器上。"IIS配置中缺少应用程序初始化模块。"请检查您的IIS是否启用了"应用程序初始化"模块。 - Ludwo
还有其他的想法吗?看起来我和@thomas处于同样的困境——一旦应用程序关闭,除非我访问它,否则它将不再重新启动... - Alexander
@Alexander 我已经添加了我的解决方案到这个问题中。 - Mindaugas

0

您必须执行以下步骤:

  • 打开“应用程序初始化”
    • 转到“打开或关闭Windows功能”
    • 选择“World Wide Web Services”>“应用程序开发功能”>“应用程序初始化”
    • 按“确定”
  • 在IIS的连接下,单击“应用程序池”
    • 右键单击创建的网站
    • 将“启动模式”更改为“始终运行”
    • 将“.NET CLR版本”更改为“v4.0”
    • 将“空闲超时(分钟)”更改为“0”
    • 按“确定”
  • 进入IIS托管站点的“高级设置”(单击站点时位于右侧)
    • 将“预加载启用”更改为“true”
    • 按“确定”

我已经把所有东西都设置好了,但仍然出现问题。但我认为在我的情况下,原因是一切都托管在Azure VM中 :) 我需要额外检查Azure的设置... - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接