IIS Express本地主机在第一次请求时加载非常缓慢。

11

在关闭之前,请检查下面的列表,确认我尝试过哪些问题是重复的。


问题:

  • 我创建了一个全新的ASP.NET MVC应用程序,构建该应用程序并运行它--> 页面需要花费20-30秒才能加载。
  • 每次我重新构建应用程序并尝试加载页面时,即使在上一次构建后立即执行此操作(即不是空闲超时问题,我猜?),也需要20-30秒

我一直在努力解决这个问题,昨天我阅读了我能找到的所有帖子/文章,但没有运气。虽然我必须承认,我是ASP.NET和Web开发的新手,对IIS配置不熟悉,因此可能会遗漏某些内容。

我尝试过的事情:

  • 禁用杀毒软件和防火墙。

  • 通过注释 hosts 文件中的 ::1 localhost 行来禁用 IPv6。 我的hosts文件如下:

    127.0.0.1       localhost
    # ::1             localhost
    
  • 尝试了不同的浏览器。

  • 更改了应用程序URL的端口号。

  • 将应用程序URL从localhost:port 更改为 127.0.0.1:port,但这样做时会出现以下错误:

    Bad Request - Invalid Hostname

  • 卸载并重新安装了IIS Express(尝试了多个版本:7.5、8.0和10.0)。

  • 尝试安装“Internet Information Services\World Wide Web Services”下的“应用程序开发功能”。

  • 启动VS安装程序并运行修复操作。

环境信息:

  • Windows 7 x64。
  • Visual Studio 2015。
  • .NET 4.5.2。
  • IIS当前启用的功能:我正在使用IIS Express,所以不确定是否相关。

启用的IIS功能

有什么想法是什么原因导致这个问题?


更新:

我刚刚尝试使用Jexus Manager。按照此处所示,从.sln文件加载配置,启动网站并尝试以下场景:

  • 重启网站后浏览网站(Jexus Manager中的两个动作)-> 15-20秒。
  • 在VS中重新构建解决方案后,在Jexus中浏览网站--> 30+秒。

你可以尝试直接在IIS Express上运行你的Web应用程序(通过命令行或类似Jexus Manager的工具)。然后在这种情况下测量性能并将其与你从Visual Studio得到的值进行比较。如果没有这样做,你就无法确定问题是出在IIS Express还是Visual Studio上。 - Lex Li
你能在Jexus Manager中启用IIS Express日志记录,并检查请求的IIS日志文件中的time-taken字段吗? - Lex Li
你尝试过在IIS上运行(不是express)吗? - Simon Mourier
没有“默认”的MVC模板。有空白和应用程序模板。空白模板会询问您要预安装哪些NuGet包,但不会生成任何代码。应用程序模板将询问您几个其他问题以生成代码。如果您选择类似基本身份验证之类的内容,它将生成实体框架标识验证。根据您使用的配置,EF启动速度较慢。基本的EF配置可能需要30秒以上的启动时间。 - ATerry
@ATerry,你说的关于身份验证和EF的事情是正确的。这是我用来测试的内容。这展示了我创建项目的步骤(没有身份验证和NuGet包中的EF)。 - 41686d6564 stands w. Palestine
显示剩余6条评论
2个回答

8
第一次启动Asp.Net MVC应用程序时会发生许多事情,因此我无法准确定位可能导致瓶颈的确切原因,但请尝试以下建议,这些建议可能有助于改善Web应用程序的启动时间:
  1. 始终在Visual Studio中以发布模式运行Web应用程序(我知道你知道,但仍然要提醒)
  2. 检查您的web.config文件,并确保System.Web\compilation具有debug=false
  3. 检查Global.asax.cs文件中的Application_Start方法,以删除不必要的调用
  4. 默认情况下,Razor视图是在运行时编译的,因此如果您在运行时不对视图进行任何修改,请确保预编译Razor视图,最好使用RazorGenerator编译您的视图。
  5. 使用分析器(例如Glimpse)对应用程序进行分析。
我希望这将在应用程序启动期间为您的应用程序提供一些增强。

为了测试,我使用了一个带有默认MVC模板的项目(没有添加任何内容),所以我猜点2和点3很可能与此无关,但我会尝试您所有的建议,并在明天提供反馈。 - 41686d6564 stands w. Palestine
谢谢!Glimpse建议非常有帮助,可以显示一些数字。这是我得到的结果示例。这些数字正常吗?顺便说一下,这是在发布模式下运行的_几乎_空项目,我在上面的评论中展示了它。 - 41686d6564 stands w. Palestine
问题在于我最近才开始学习ASP.NET(来自桌面背景)。因此,我正在进行一些实验(遵循一些教程),并且自然而然地不断进行一些小改动,重建并尝试检查结果以确认我做得正确。每次重建后要等待30秒钟才能加载页面(不包括构建时间),这真的很令人沮丧! - 41686d6564 stands w. Palestine
我知道你的痛苦,我也曾经历过。从摘要视图来看,无法确定问题所在,如果您可以发布按方法分解时间的详细视图,可能有人能够识别出问题。另外,如果您想在视图(cshtml)中进行更改,您不需要重新构建项目,只需刷新页面即可查看更改。对于后端,请尝试使用类似于Windows应用程序的编辑和继续功能。 - Dipen Shah

1
以下可能是导致此问题的原因:
- 服务器负载过重。 - 特定工作进程一直处于空闲状态。 - 没有可用的新处理空间。
有一个伪装良好的选项称为“空闲超时操作”,可以在“应用程序池”的“高级设置”中更改。默认情况下,“超时”操作设置为“终止”,这意味着托管站点的Windows进程将被终止。如果发生此终止,必须构建站点并在下次访问时启动进程,从而导致第一次加载非常缓慢。
如果您为自己的服务或少量站点运行专用服务器,则显然会受到影响。在这些情况下,将其设置为0是可行的。其他人认为1740分钟是最佳选择。为什么?因为它是24小时内最小的素数。
要在Microsoft Windows Server 2012 R2上将“空闲超时操作”更改为0,请访问IIS,并选择为您的站点提供服务的应用程序池,并选择右侧菜单中的“高级设置”,找到“空闲超时(分钟)”选项,将其更改为0,然后按“确定”。
另一个可能的解决方案:安装IIS功能“应用程序初始化”。然后,使用以下配置应该可以工作:
  • 将应用程序池的启动模式设置为AlwaysRunning
  • 在网站级别上将Preload Enabled设置为True

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