如何在IIS 7.5上预热ASP.NET MVC应用程序?

时间:2011-09-12 11:25:59

标签: asp.net entity-framework asp.net-mvc-3 iis warm-up

我们想要热身IIS 7.5服务器上托管的ASP.NET MVC应用程序。以前在http://forums.iis.net/t/1176740.aspx可用的预热模块已被删除。

每当IIS或ASP.NET工作进程因任何原因重新启动时,应该预热应用程序。在预热期间,IIS应返回一些HTTP状态代码,表示其处于预热状态或无法为任何客户端提供服务。

创建一个可执行文件,通过HttpRequests浏览网站中的必要页面是一个好主意吗?可执行文件可以从IProcessHostPreloadClient实现中触发。是否可以配置IIS以便它只接受来自localhost的请求,一旦可执行文件完成,它就可以切换到所有客户端 - 但是该交换机不应该触发IIS重启(显然)。

是否可以使用Visual Studio 2010 - Web性能测试来预热应用程序而不是创建手动可执行文件?还有其他选择吗?

PS:应用程序使用表单身份验证并使用会话 - 因此维护状态cookie和其他cookie非常重要。

更新1 - 我们在应用程序中使用.NET Framework 4.0和Entity Framework(数据库优先)。首次点击EF查询的速度很慢。热身背后的原因是让这些第一次击中。我们已经在大多数地方使用了编译查询,并且已经为EF实现了预编译视图。模型和应用程序的大小非常大且复杂。热身需要遍历许多页面,以确保在任何最终用户访问应用程序之前至少执行一次编译和非编译的EF查询。

3 个答案:

答案 0 :(得分:11)

微软发布了一个完全符合你要求的模块。 Application Initialization Module for IIS 7.5通过在第一个请求到达之前加载Web应用程序来提高Web站点的响应能力。

您可以在接受来自真实用户的请求之前指定IIS将预加载的一系列Url。我不认为你可以获得真正的用户登录,但也许你可以设置不需要登录的模拟页面来满足你要求的相同热身?

我认为最引人注目的功能是该模块还可以实现重叠的流程回收。 following tutorial from IIS 8.0包括如何启用重叠流程回收的逐步方法。

当IIS检测到正在回收活动工作进程时,IIS不会将活动流量切换到新的回收工作进程,直到新工作进程在新进程中完成所有应用程序初始化Urls的运行。这可确保浏览您网站的客户在应用程序运行并运行后不会看到应用程序初始化页面。

此IIS应用程序初始化模块内置于IIS 8.0中,但是available for download for IIS 7.5

答案 1 :(得分:9)

您可以查看following post,了解IIS 7.5和ASP.NET 4.0中内置的自动启动功能。

答案 2 :(得分:5)

任何为托管资源生成服务器请求的应用程序都可用于预热IIS进程。确切地说,您需要多少个请求取决于需要预热的部件。通常,预热用于:

  • 启动工作进程。为此,您只需要请求一个资源来为整个应用程序预热一个进程。
  • 执行任何静态初始化,数据库启动或预缓存。您在第一次请求时会在Global.asax文件中执行任何操作,因此如果您可以进行所有初始化,您仍然只需要发出一个页面请求。
  • 强制预编译ASP.NET页面。为此,您需要点击每一页。幸运的是,这通常不是一个时间成本,所以你可能不需要担心它。如果您的页面加载速度很慢,可以单独加热。

这里的“热身”过程并不神奇。您只需要强制IIS来提供相关URL。你提到的所有内容都会照顾到这一点:使用压力测试工具查询URL,编写自定义实用程序来发布HTTP请求,甚至只需编写“wget”或PowerShell脚本等脚本来下载URL就可以了

就我所知,在IIS中限制对localhost的访问,更改它的唯一方法是需要重新启动IIS。您总是可以在应用程序中构建预请求挂钩并在那里维护状态,并让您的预热过程查询一些特定的URL,将该状态切换为“打开”。但我不确定你会完成什么。如果用户确实在热身结束之前尝试查询您的网站,那么所有这一切都会发生,您的网站需要很长时间才能回复,然后他们最终会获得他们要求的网页。如果你在热身期间将他们锁定在网站之外,他们会得到一个浏览器网络错误,声称网站处于脱机状态,这对我来说听起来更糟糕。