我们有一个在IIS Web-Garden中运行的ASP.Net Web应用程序 - 它被配置为最多分配四个进程.在我们的Web应用程序中,第一个访问该站点的用户会导致加载所有缓存的项目.由于我们在IIS Web-Garden中运行,因此最终需要最多四个用户为四个Web-Garden进程中的每一个构建缓存.这个缓存构建需要30-40秒,我们试图让它更快,但不太可能再改进它.
这是不可接受的,我们的任务是让所有人都能快速访问网站(无需等待缓存初始化).我想使用一种抓取网站来预热缓存的解决方案.问题是Web-Garden功能似乎是一个黑盒子 - 你无法控制IIS是否/何时决定在下一个HTTP请求命中时加载第2,第3或第4个进程.
对我来说,这似乎是一个常见问题,但寻找解决方案却收效甚微.我的问题是,有没有办法通过HTTP标头或其他一些构造给IIS一个提示,你希望它加载或至少路由到进程2,3,4等?
根据微软工程师的说法,这对于IIS 6是不可能的.但是他们在IIS 7.5和ASP.Net 4.0中增加了一个新功能,它提供了一个很好的配置,正是我在这里寻找的东西.它被称为"preloadProvider".下面是一个示例代码段(非常酷!).
http://forums.iis.net/p/1158476/1907392.aspx
由于单个应用程序池可以包含多个应用程序,因此可以使用applicationHost.config文件中的以下配置指定要自动启动的各个应用程序:
当冷启动IIS 7.5服务器或回收单个应用程序池时,IIS 7.5使用applicationHost.config文件中的信息来确定需要自动启动哪些Web应用程序.对于标记为自动启动的每个应用程序,IIS7.5向ASP.NET 4.0发送请求,以在应用程序暂时不接受HTTP请求的状态下启动应用程序.当它处于此状态时,ASP.NET将实例化preloadProvider属性定义的类型(如上例所示)并调用其公共入口点.通过实现IProcessHostPreloadClient接口创建具有必要入口点的托管自动启动类型,如以下示例所示:
public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient { public void Preload(string[] parameters) { // Perform initialization. } }
初始化代码在Preload方法中运行并且方法返回后,ASP.NET应用程序已准备好处理请求.通过在IIS 7.5和ASP.NET 4.0中添加自动启动,您现在可以在处理第一个HTTP请求之前使用定义明确的方法来执行昂贵的应用程序初始化.例如,您可以使用新的自动启动功能初始化应用程序,然后向负载均衡器发出信号,表明应用程序已初始化并准备接受HTTP流量.