IIS 8.5 - 应用程序初始化未能正常工作

14

我已经安装了应用程序初始化,将网站的应用程序池启动模式设置为“始终运行”,并在网站的高级设置中将Preload Enabled =“True”。

但是,如果我手动回收应用程序池并等待10秒钟,然后重新加载网站,我仍然需要等待另外10秒钟才能使网站变热。这表明网站没有启动。

查看任务管理器,我可以看到应用程序池一直在运行 - 即使在回收后也是如此。但是,在我自己向网站发出请求之前,内存使用率非常低。

我注意到一件事情,即我在我的网站的高级设置中没有“自动启动”设置,如下面链接所示: https://blogs.msdn.microsoft.com/vijaysk/2012/10/11/iis-8-whats-new-website-settings/

如何使我的应用程序自动启动?


你有没有在这方面取得任何进展? - BeanFrog
我最终成功了。一切都必须完全正确才能正常运行,而自动启动的URL必须是一个完整的控制器和操作引用(与MVC一起使用时)。希望我刚刚发布的答案能对你有所帮助。 - Laurence Frost
5个回答

26

结果证明,需要正确设置的项目非常多。按照此链接的步骤安装相关组件并进行各种配置更改:http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization

对我来说缺失的关键部分是Web.config中的以下指令。我把它设置为“/Login”,这是一个有效的路由,但一旦我将其切换为“/[Controller]/[Action]”,它就可以正常运行了。

这条路由的优点是,您可以创建一个自定义操作,也会触发数据库(初始化Entity Framework),并执行任何其他缓慢的初始化。对于我而言,我只是从DB表中读取记录,因此可以让ASP.NET自动启动,并节省几秒钟用于预热EF :)

<system.webServer>
  <applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
      <add initializationPage="/Login/WarmUp" />
    </applicationInitialization>
</system.webServer>

9
请注意,如果该网站已配置为 要求 SSL,则初始化将无法正常工作。参见IIS 7.5应用程序初始化热身和HTTPS。解决方法:不要要求SSL + URL重写。请参见Web站点要求SSL时应用程序初始化模块失败。通常,您需要将 localhost 替换为您服务器的规范名称。 - Excelosaurus
添加控制器操作对我没有起作用。真的很奇怪,因为在我的同事的机器上只有控制器就可以工作。在我的机器上,当我回收应用程序池时,似乎应用程序初始化模块甚至都没有被触发。 - Vin Shahrdar
在我的情况下,我还必须在应用程序池的高级设置中将选项“禁用重叠回收”设置为“true”。 - ka3yc

10

即使在 Server 2019 上,这仍然是一个问题;如果没有安装此项,当网站在 IIS 中启动时会出现“PreloadEnabled”无法识别的错误。 - cvocvo

8

这些文章非常好:

使用 IIS 应用初始化来维持 ASP.NET 应用程序的活性

IIS 8.0 应用初始化

然而,在我的情况下,安装应用初始化角色出现了问题。

检查你的 IIS 应用程序的模块列表。确保ApplicationInitializationModule存在。

enter image description here

我需要卸载 / 重新安装此模块。

我不知道发生了什么,因为一开始看起来它是工作的,然后在开发几周后就停止了。无论如何的调试和重做都没有解决问题,我开始怀疑自己是否真正看到这个工作过。

删除 / 重新安装应用初始化模块角色后问题得到解决。


这个“Application Initialization Role”在哪里?我只看到了“ApplicationInitializationModule”... - Vin Shahrdar
对于工作站:PS C:> Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationInit - Brain2000

7

有多个.config位置可以设置这些设置。

  1. 机器applicationHost.config(c:\ windows \ system32 \ inetsrv \ Config)
  2. 网站web.config(对于默认网站的c:\ inetpub \ wwwroot)
  3. 应用程序web.config

我尝试了所有这些,但只成功配置了第三个,即应用程序web.config。我的具体用例是调用WCF服务上的GET方法。

应用程序初始化步骤也可以在其他答案中找到。以下是最有帮助的一个步骤:IIS 8.0应用程序初始化

  1. Install the Windows feature Application Initialization (Web-AppInit)
  2. Set the IIS app pool Start mode = AlwaysRunning
  3. Set the IIS application Preload Enabled = true
  4. Add to the application web.config

    <system.webServer>     
        <applicationInitialization doAppInitAfterRestart="true" skipManagedModules="true">
            <add initializationPage="/Service.svc/Method/Parameter" />
        </applicationInitialization>
    </system.webServer> 
    
  5. Recycle app pool

  6. Check that the app initialized.
我想指出的是,初始化页面相对于应用程序而不是网站/域名的根目录。因此,如果我的绝对路径是:
domain.com/path1/path2/Service.svc

我不会在initializationPage参数中包含/path1/path2


3
我按照完全相同的步骤操作,但是在重启IIS或回收应用程序池后,这个应用程序初始化模块没有连接到我的控制器。不确定我错过了什么... - Vin Shahrdar

5
如果有人在MVC中需要初始化多个区域,需要将区域放在根web.config文件中的开头。我曾经试图将其放在区域的web.config中,但卡住了一段时间。此外,它与混合应用程序完全兼容。
<add initializationPage="/NotMVC.aspx" />
<add initializationPage="/Area1/Controller/Action" />
<add initializationPage="/Area2/Controller/Action" />

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