IIS 应用程序池/重启和 ASP.NET

12

我们正在使用IIS7来托管基于asp.net的Web应用程序。 在这个环境中,管理员和开发人员可以定期部署代码到应用程序中。

新的代码或应用程序作为DLL文件放入ASP.NET bin文件夹。在部署新的DLL时,IIS将重新启动进程,影响(减慢)所有在线用户。

有没有一种方法可以配置IIS在后台运行进程,并在准备好后从旧状态切换到新状态,而不会影响用户?!

感谢您提前的反馈!

2个回答

26

IIS已经实现了这一点,这就是回收的全部内容。在旧版本应用程序仍在运行时加载DLL。只有完成此操作后,回收才完成。

然而加载DLL只是准备Web应用程序的一部分,还可能有初始加载,例如加载/缓存用户数据库等。
这些操作不是回收过程的一部分,它们发生在所有DLL重新加载并且回收已经完成之后。

不久前,我遇到了一个应用程序的问题,由于启动时进行了大量的数据库活动/缓存,导致启动时间很长。因此,我想知道是否有某些功能允许我们在将回收标记为已完成之前执行代码,以便在一切准备就绪时首先考虑应用程序已被回收。基本上,我想要一些分段功能。
我与IIS团队联系,但他们告诉我没有这样的功能存在,也没有计划

要解决这个问题,您可以尝试以下操作:

  • 使用交替部署方式:
    您可以设置两个具有独立应用程序池的网站。其中之一是实时网站,另一个是暂存网站。如果您想要部署变更,只需部署到暂存网站即可。在所有内容都加载/缓存等操作完成后,将 Web 应用程序的 URL 设置切换为重定向传入请求从实时网站到暂存网站。这样实时网站就成为了新的暂存网站,反之亦然。下一次部署将再次转到新的暂存网站中。

更新:
显然,现在他们已经创建了一个 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应用程序预热模块入门”。

请参阅:

http://www.asp.net/whitepapers/aspnet4

如果您使用ASP.NET 4自动启动功能: 您仍然可以选择定期自动回收工作进程。但是,这样做后,应用程序将立即重新启动,并且您的预热代码将执行(与今天不同-您必须等待下一个请求才能执行)。 预热模块是回收过程的一部分,这是预热和自动启动功能之间的主要区别。而不是在运行init代码时阻止请求应用程序。 使用自动启动功能唯一的好处是您不必等待用户点击页面,这对您没有帮助。 请参见Gu的博客文章:

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

更新2:

遗憾的是,IIS 7/7.5已经停止使用预热模块:

http://forums.iis.net/t/1176740.aspx

它将成为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


非常感谢您的评论,我得出结论需要将缓存和预加载操作移动到一个独立进程模式中,在那里可以卸载一些应用程序的初始化工作并实现“自动启动”,最后等待IIS8 :) - sam360
1
暖身模块在IIS 7.5中仍然存在,称为“ IIS 7.5应用程序初始化模块”:http://www.iis.net/downloads/microsoft/application-initialization - NicolasF

5
ntziolis答案的第一部分有些不准确。工作进程并没有被回收或重新启动,它只是继续运行。如果是这种情况,在共享池环境中,每次部署新站点时都会使站点崩溃。
当您部署新的ASP.NET应用程序时,站点的“应用程序域”在工作进程内被拆除,而不是池进程。
此外,池回收是与部署完全不同的概念。
在ASP.NET商业生命周期的这个时刻,在部署期间,直到所有站点都部署完毕,站点仍处于不一致的状态。对于单个服务器上的单个站点部署,Microsoft目前还没有好的解决方案。
这就是为什么ASP.NET有特殊的App_Offline.htm页面。它存在的目的是让您可以启用该页面,进行部署,然后关闭它。 ntziolis答案的第二部分几乎正确,但您不需要两个站点或两个应用程序池。如果您在单个服务器上而不是在负载均衡器或ARR后面,则只需要两个文件系统文件夹,这些文件夹在站点的物理文件夹之间切换。
如果您的站点位于负载平衡器或ARR后面的Web服务器上,则拥有两个不同的站点是有意义的,您可以将一个站点的请求路由到另一个站点,并在每次部署时轮询。
显然,如果有大量用户生成的内容(上传的文件等),则应将虚拟目录映射到此数据的公共位置。
在更大规模的部署中,例如跨负载平衡环境运行您的应用程序,您可以进行更复杂的部署。
有关相关问题,请参见:

如何在Web应用程序正在运行时将应用程序部署到IIS

发布/上传新的DLL到IIS:上传期间网站崩溃

组件化ASP.NET MVC应用程序是否可以进行平滑部署?


第一部分可能可以更加精确,读完后感觉部署和回收有些交织在一起。然而,我认为他的问题是应用程序启动代码过于昂贵,而不是实际的部署相关问题,因此我专注于缺乏 IIS 8 前的预热模块。 - ntziolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接