编译后运行是ASP.NET Web应用程序的一大优点,但是应用程序在部署之后,第一次被访问时由于需要即时编译,因而ASP.NET Web应用程序的第一的用户往往会感觉响应速度很慢。而新发布的.NET 4.0提供了Web应用程序自行启动并提前主动式的初始化,而无需再等待客户端访问服务器。相当于Web应用程序在对外提供第一次服务时,就已经“热身”完毕,开发者甚至可以编写自定义的脚本让服务器进一步热身,如准备好需要的数据缓存。这种机制在Web Form和MVC应用程序中都有效。
有些Web应用程序在处理到达的请求之前,需要加载大量的数据或者执行耗费时间的初始化过程,目前ASP.NET开发者处理这种问题的时候一般使用应用程序的Global.asax文件中的Application_Start事件处理程序(该事件在第一次请求处理时被触发)。这种方法往往这样设计:编写自定义的脚本向应用程序发送假的请求以定期的“唤醒”并执行这些代码,以便上述任务在第一个请求到达之前完成,或者简单的使得不幸的第一个访问者等待预处理逻辑的完成(这经常会导致很长事件的延迟)。ASP.NET 4具备了一种新的特性“Auto-Start”,它能够更好的对付这种情况,有个前提:ASP.NET 4 运行在IIS 7.5(Windows 7 和 Windows Server 2008 R2自带)。自行启动的属性提供了一个可控的方法来启动一个应用程序工作者进程并初始化一个ASP.NET应用程序,然后接受HTTP请求。
接下来讨论,如何配置一个ASP.NET 4应用程序使之自行启动的方法。为使用ASP.NET 4的自行启动特性,我们首先要确保Web服务器启动时IIS应用程序池中的工作者进程能够自行启动。设置方法:打开IIS7.5的applicationHost.config文件
(位于:C:/Windows/System32/inetsrv/config/applicationHost.config),在 节点中添加一个属性startMode="AlwaysRunning",如下代码:
如果这时打开任务管理器,选中“显示所有用户的进程”复选框,然后将刚刚打开并修改的applicationHost.config文件保存,我们会发现一个新的w3wp.exe工作者进程立刻会出现。
单个IIS工作者进程能够供多个ASP.NET应用程序运行,我们可以指定哪些应用程序能够自行启动,这种功能通过如下设置代码完成:
上面的serviceAutoProvider="PreWarmMyCache"属性引用了一个提供者名称,这能够使我们设置一个自定义的类,用于封装为应用程序“热身”的逻辑。在工作者进程和应用程序在预加载时(在任何外部web访问请求到达之前),该类能够自动运行。在任何请求到达和被处理之前,我们可以在这里执行任何初始化或者缓存加载逻辑。
public class PreWarmCache: System.Web.Hosting.IProcesHostPreloadClient{
public void Preload(string[] parameters){
// Perform initialization and cache loading logic here
}
}
IIS启动web应用程序进入这样一种状态:直到我们的“热身”逻辑完成之后,才会接收访问请求。当Preload方法中的初始化代码运行并返回,该ASP.NET应用程序被标记为准备好处理请求。
我们可以选择将新的“自行启动”特性与IIS7 的Application Request Routing扩展的负载均衡能力相结合,一旦程序初始化完毕并准备好接收HTTP请求,我们就使用它通知负载均衡器。
总结
ASP.NET和IIS 7.5中新的“自行启动”特性提供了一个定义良好的途径:我们可以运行扩展的应用程序启动和预缓存逻辑,这样就可以在任何终端用户访问我们的程序之前,准备好一切需要的东西。这种机制能够使我们的程序在最开始就“热好身”,能够提供一个始终如一的高性能体验。
视频:http://www.asp.net/aspnet-4/videos/aspnet-4-quick-hit-auto-start