当我第一次访问我的ASP.NET MVC网站的任何页面时,第一个请求很慢。它需要大约4-5秒钟才能加载。但是对于任何页面的每个后续请求都很快。
当我等待几分钟或一小时后,每个第一次请求再次变慢。每个后续请求都很快。
我认为IIS 7正在编译代码并将其保存在内存中。过一段时间后,它将从内存中删除它,因此需要重新编译它。
如果可能的话,我该怎么做才能使每个第一次请求与每个后续请求一样快呢?(不预编译我的源代码)
非常感谢您的帮助!
当我第一次访问我的ASP.NET MVC网站的任何页面时,第一个请求很慢。它需要大约4-5秒钟才能加载。但是对于任何页面的每个后续请求都很快。
当我等待几分钟或一小时后,每个第一次请求再次变慢。每个后续请求都很快。
我认为IIS 7正在编译代码并将其保存在内存中。过一段时间后,它将从内存中删除它,因此需要重新编译它。
如果可能的话,我该怎么做才能使每个第一次请求与每个后续请求一样快呢?(不预编译我的源代码)
非常感谢您的帮助!
哦,而且免费支持50个站点!
这可能是应用程序池中的回收工作进程设置,检查其值并关闭它或增加时长。
也可能是由于应用程序池性能下闲置后关闭工作进程。
很可能是第二个原因,因为默认设置为20分钟,而第一个默认设置为29小时左右。
假设您有定期的访客流量,这在生产中不应该是问题。此外,除非您在物理上更改任何源文件,否则当IIS启动您的应用程序时,它不会重新编译它。
另外,请查看可用的.NET编译设置: http://technet.microsoft.com/en-us/library/cc725812(WS.10).aspx
简而言之
经过相当广泛的测试和收集相关来源来尝试解决问题,我认为最小的解决方案可能是(未经验证)将此代码添加到global.asax中:
protected void Application_End()
{
...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://web_domain.tld");
using (HttpWebResponse response = (HttpWebResponse)
request.GetResponse())
{
}
...
}
Idle Time-out(分钟)
设置为0相结合。 然而,我认为改变Idle Time-out(分钟)
可能并不必要(假设在应用程序池切换到空闲模式时引发了Application_end
事件)。
它的工作原理(假设它确实起作用):
在IIS应用程序池设置中有两个设置会影响应用程序何时被挂起或终止。其中之一是空闲超时(分钟)
,默认为20分钟,当自上次请求以来经过指定时间后,工作进程将被挂起或终止。当下一个请求到来时,工作进程将恢复或重新启动,并引发Application_start事件(因此,如果在global.asax中定义了Application_start处理程序,则会执行它)。在我所工作的项目中,Application_start需要大约17秒才能完成。因此,如果网站“独自一人”21分钟,然后新请求到来,那么在发送响应之前需要大约17秒左右(Application_start +页面处理)。当在20分钟的窗口期内发送另一个请求时,响应速度显着加快(可能少于1秒),因为Application_start已经被处理。空闲超时(分钟)
值设置为0会导致工作进程永远不会被挂起/终止(至少由于空闲时间 - 可能存在下面描述的其他原因)。可能的解决方案(无需更改IIS设置): 如果请求被频繁发送,应用程序池可能永远不会切换到空闲模式。在回收事件发生时,这也会导致应用程序重新启动。例如,可以使用@Rippo描述的第三方服务来实现此目的。
建议的解决方案:
观察到应用程序池回收会导致引发Application_end
事件。假设它在应用程序池切换到空闲模式时也会引发,那么在Application_end
事件处理程序中向网站创建一个请求似乎就足以使应用程序重新启动(引发Application_start事件)。代码位于答案顶部。