我们正在使用IIS7来托管基于asp.net的Web应用程序。 在这个环境中,管理员和开发人员可以定期部署代码到应用程序中。
新的代码或应用程序作为DLL文件放入ASP.NET bin文件夹。在部署新的DLL时,IIS将重新启动进程,影响(减慢)所有在线用户。
有没有一种方法可以配置IIS在后台运行进程,并在准备好后从旧状态切换到新状态,而不会影响用户?!
感谢您提前的反馈!
IIS已经实现了这一点,这就是回收的全部内容。在旧版本应用程序仍在运行时加载DLL。只有完成此操作后,回收才完成。
然而加载DLL只是准备Web应用程序的一部分,还可能有初始加载,例如加载/缓存用户数据库等。
这些操作不是回收过程的一部分,它们发生在所有DLL重新加载并且回收已经完成之后。
不久前,我遇到了一个应用程序的问题,由于启动时进行了大量的数据库活动/缓存,导致启动时间很长。因此,我想知道是否有某些功能允许我们在将回收标记为已完成之前执行代码,以便在一切准备就绪时首先考虑应用程序已被回收。基本上,我想要一些分段功能。
我与IIS团队联系,但他们告诉我没有这样的功能存在,也没有计划。
要解决这个问题,您可以尝试以下操作:
更新:
显然,现在他们已经创建了一个 IIS 模块,提供了此功能:
IIS 7.5的应用程序预热模块
IIS团队发布了第一个beta测试版的IIS 7.5应用程序预热模块。这使得预热你的应用程序比以前更加容易。您无需编写自定义代码,只需指定在Web应用程序接受来自网络的请求之前要执行的资源的URL。这个预热发生在IIS服务启动期间(如果您将IIS应用程序池配置为AlwaysRunning),以及当IIS工作进程回收时。在回收期间,旧的IIS工作进程继续执行请求,直到新生成的工作进程完全预热,以便应用程序不会因未经过预热的缓存而出现中断或其他问题。请注意,此模块与任何版本的ASP.NET一起使用,从2.0版本开始。
有关更多信息,请参见IIS.net网站上的“应用程序预热”。有关说明如何使用预热功能的演示,请参见IIS.net网站上的“IIS 7.5应用程序预热模块入门”。
请参阅:
如果您使用ASP.NET 4自动启动功能: 您仍然可以选择定期自动回收工作进程。但是,这样做后,应用程序将立即重新启动,并且您的预热代码将执行(与今天不同-您必须等待下一个请求才能执行)。 预热模块是回收过程的一部分,这是预热和自动启动功能之间的主要区别。而不是在运行init代码时阻止请求应用程序。 使用自动启动功能唯一的好处是您不必等待用户点击页面,这对您没有帮助。 请参见Gu的博客文章:
更新2:
遗憾的是,IIS 7/7.5已经停止使用预热模块:
它将成为IIS8的一部分(现在称为应用程序初始化模块):
http://weblogs.asp.net/owscott/archive/2012/03/01/what-s-new-in-iis-8.aspx
更新3:
评论中指出,在发布IIS 8之后,应用初始化模块(Application Initialization Module)作为IIS 7.5的热身模块再次出现:
http://www.iis.net/downloads/microsoft/application-initialization
App_Offline.htm
页面。它存在的目的是让您可以启用该页面,进行部署,然后关闭它。
ntziolis答案的第二部分几乎正确,但您不需要两个站点或两个应用程序池。如果您在单个服务器上而不是在负载均衡器或ARR后面,则只需要两个文件系统文件夹,这些文件夹在站点的物理文件夹之间切换。