如何让.Net Core网站在IIS上立即启动?

9
这篇博客文章解释了当一个 .Net Core 网站在 IIS 中托管时,网站代码实际上直到第一个请求进入 IIS 才会被执行:

https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS

我看到了完全符合这种行为的情况,一旦第一个请求进来,所有东西都开始运行。 我有一个使用案例,我真的需要网站代码在IIS启动时立即启动。 是否可以从网站内部以编程方式执行此操作或使用配置中的某些内容,以便我不必每次重启IIS时都记得ping我的网站?谢谢。


这个有帮助吗?https://msdn.microsoft.com/zh-cn/library/ee677260(v=azure.10).aspx - Dai
这是一个应用程序,而不是HTML页面。它需要启动,除非它一直在运行。服务器和大多数托管提供商默认设置为,如果一段时间没有使用应用程序,则将其休眠。通常您需要支付更多费用以保持始终开启状态,或者使用自己的虚拟服务器等。 - Johan Herstad
4个回答

12

我尝试了所有自动启动选项,最终找到了一个组合,解决了我的问题。在应用程序池中设置“启动模式”为“AlwaysRunning”,在网站本身上设置“启用预加载”为“true”。有了这两个设置,应用程序立即启动。现在,我发现了一些意外的事情。当网站处于停止状态时,我的应用程序仍然在运行。我发现,如果我想停止我的应用程序,我必须停止应用程序池,而不是网站。

如果这不起作用,请确保已安装IIS的应用程序初始化功能,因为它是可选的。

https://learn.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-application-initialization

Core 3.1 更新: 我已确认此解决方案适用于 Core 3.1。如果发现无法正常工作,请再次检查是否已安装 IIS 的应用初始化功能。该解决方案的缺点是,立即停止应用程序池会立即停止我的应用程序,没有优雅地结束方式。如果未安装应用程序初始化功能,则我的应用程序将在停止应用程序池时正常停止,但是应用程序不会自动启动。


2
由于某些原因,对我不起作用。(应用程序初始化功能已安装,Windows Server 2012 R2,ASP.NET Core 3.0,内部托管) - Michael
1
@Mike 我从未尝试过使用Core 3.0。我希望这不是问题,因为我迟早需要升级。在安装应用程序初始化后,机器是否重新启动?该功能告诉您它将在无需重新启动的情况下工作,但我的经验并非如此。 - Eric
4
与@Mike相同,使用ASP.NET Core 3.0,已安装Application Initialization功能,应用程序池具有AlwaysRunning启动模式,站点已启用预加载。web.config也已启用预加载。重启机器没有帮助。 - Zhuravlev A.
我刚试了一下Asp.NET Core 3.0,它可以正常工作。如果有人感兴趣,就加上这个信息吧。 - Zein Sleiman
当网站处于停止状态时,我的应用程序仍在运行。我发现,如果我想停止我的应用程序,我必须停止应用程序池,而不是网站。我在Core 3.0中也遇到了这个问题,可以安全地假设这是一个错误吗?如果是,它是否在3.1中得到解决,或者MS是否在任何地方记录了这个问题? - Luke

0
如果您想要在服务器重新启动后立即配置应用程序,您可以使用以下命令设置AppPool和应用程序设置。当您无法远程桌面连接到服务器时,这非常有用。以下假设应用程序位于“默认网站”下。您需要使用您的情况的值替换和。
%windir%\system32\inetsrvappcmd.exe set apppool "<APP POOL NAME>" /startMode:AlwaysRunning
%windir%\system32\inetsrvappcmd.exe set app "Default Web Site/<APPLICATION NAME>" /preloadEnabled:true

注意:这是针对一个.NET 6 Web应用程序的说明,并假设您已经安装了IIS模块应用程序初始化。如果您尚未安装IIS模块,请先进行安装,然后再运行命令。

0

我尝试了@eric上面的解决方案,但它本身并没有起作用。将这个添加到我的.CSPROJ文件中(除了他的建议之外)最终解决了问题:

<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup>

-1

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