【发布时间】:2012-03-28 08:48:58
【问题描述】:
我们正在使用 IIS7 来托管一个基于 web 的 asp.net 应用程序。 在这种环境中,管理员和开发人员可以定期将代码部署到应用程序中。
新代码或应用程序作为 DLL 进入 ASP.NET bin 文件夹。部署新 DLL 后,IIS 重新启动进程,影响(减慢)所有在线用户。
有没有办法将 IIS 配置为在后台运行进程,一旦准备好从旧状态切换到新状态而不影响用户?!
提前感谢您的反馈!
【问题讨论】:
我们正在使用 IIS7 来托管一个基于 web 的 asp.net 应用程序。 在这种环境中,管理员和开发人员可以定期将代码部署到应用程序中。
新代码或应用程序作为 DLL 进入 ASP.NET bin 文件夹。部署新 DLL 后,IIS 重新启动进程,影响(减慢)所有在线用户。
有没有办法将 IIS 配置为在后台运行进程,一旦准备好从旧状态切换到新状态而不影响用户?!
提前感谢您的反馈!
【问题讨论】:
IIS 已经这样做了,这就是回收的全部内容。 IT 正在加载 DLL,而旧版本的应用程序仍在运行。只有在完成此操作后,才能完成回收。
但是加载 DLL 只是准备好 Web 应用程序的一部分,也可能会有初始加载,例如加载/缓存用户数据库等。
这些操作不属于回收过程,它们发生在所有 DLL 重新加载并且回收已经完成之后。
不久前,由于启动期间的大量数据库活动/缓存,我遇到了一个应用程序启动时间很长的问题。所以我很感兴趣是否有一些功能允许我们在回收标记为完成之前执行代码,以便在一切准备好运行时首先考虑应用程序回收。基本上我想要的是某种暂存功能。
我就这个问题与 IIS 团队联系过,遗憾的是他们告诉我不存在这样的功能,也没有计划。
要解决此问题,您可以尝试执行以下操作:
更新
显然他们现在已经创建了一个 IIS 模块来提供这个功能:
IIS 7.5 的 IIS 应用程序预热模块
IIS 团队发布了第一个 beta 测试版 IIS 7.5 的应用程序预热模块。这让你热身 应用程序甚至比以前描述的更容易。而不是写 自定义代码,您指定要在之前执行的资源的 URL Web 应用程序接受来自网络的请求。发生这种热身 在 IIS 服务启动期间(如果您配置了 IIS 应用程序池作为 AlwaysRunning)和 IIS 工作进程时 回收。在回收期间,旧的 IIS 工作进程继续 执行请求,直到新生成的工作进程完全运行 热身,使应用程序不会遇到中断或其他 由于未准备好的缓存导致的问题。请注意,此模块适用于任何 ASP.NET 版本,从 2.0 版开始。
有关详细信息,请参阅 IIS.net 网站上的应用程序预热。 有关说明如何使用预热功能的演练,请参阅 IIS 7.5 应用程序预热模块入门 IIS.net 网站。
见:
如果您使用 ASP.NET 4 自动启动功能:
您仍然可以选择不时自动回收工作进程 时间。但是,当您这样做时,应用程序将立即重新启动并 您的热身代码将执行(与今天不同 - 您必须等待 为下一个请求执行此操作)。
预热和自动启动功能的主要区别在于预热模块是回收过程的一部分。而不是在运行初始化代码时阻止应用程序的请求。
使用自动启动功能唯一的好处是您不必等待用户点击页面,这对您的情况没有帮助。
见顾的博文:
更新 2:
遗憾的是,IIS 7/7.5 的预热模块已经停止:
不过它将成为 IIS8 的一部分(现在称为应用程序初始化模块):
http://weblogs.asp.net/owscott/archive/2012/03/01/what-s-new-in-iis-8.aspx
更新 3:
正如 cmets 中所指出的,在 IIS 8 发布后,IIS 7.5 的预热模块重新出现为 IIS 7.5 的应用程序初始化模块:
http://www.iis.net/downloads/microsoft/application-initialization
【讨论】:
ntziolis answer 的第一部分有点不准确。工作进程没有被回收或重新启动,它只是继续运行。如果是这种情况,那么在共享池环境中,每次部署新站点时都会导致站点被淘汰。
当您部署新的 ASP.NET 应用程序时,它是站点的“应用程序域”在中,工作进程被拆除,而不是池进程。
此外,池回收是一个完全独立于部署的概念
在 ASP.NET 商业生命周期的这个时间点,在部署期间,站点将处于不一致状态,直到所有站点都部署完毕。目前,对于单服务器部署上的单站点,Microsoft 仍然没有关于此的好消息。
这就是为什么 ASP.NET 有特殊的App_Offline.htm 页面。它在那里,因此您可以启用该页面、部署然后将其关闭。
ntziolis answer 的第二部分几乎是正确的,但您不需要两个站点或两个应用程序池。您只需要两个文件系统文件夹,它们可以在站点的物理文件夹之间切换……如果您在单个服务器上而不是在负载平衡器或 ARR 后面。
如果您的站点位于负载均衡器或 ARR 后面的 Web 服务器上,那么拥有两个不同的站点就有意义,您可以将请求从一个站点路由到另一个站点,并在每次部署时进行循环。
显然,如果有大量用户生成的内容(上传的文件等),那么您需要将站点中的虚拟目录映射到该数据的公共位置。
在您的应用在(例如)负载平衡环境中运行的大规模部署中,您可以进行更复杂的部署。
相关问题请见:
How Do I deploy an application to IIS while that web application is running
Publishing/uploading new DLL to IIS: website goes down whilst uploading
Is smooth deployment possible with componentized ASP.NET MVC apps?
【讨论】: