2012-03-11 67 views
11

我们使用IIS7来托管基于Web的应用程序。 在此环境中,管理员和开发人员可以定期将代码部署到应用程序。IIS应用程序池/重新启动和ASP.NET

新代码或应用程序将作为DLL传递到ASP.NET bin文件夹。在部署新的DLL后,IIS重新启动该过程,影响(减慢)所有在线用户。

有没有办法配置IIS在后台运行进程,并且一旦准备好从旧状态切换到新状态而不影响用户?

在此先感谢您的反馈!

回答

26

IIS已经这样做,这就是回收的全部内容。 IT的加载DLL的应用程序的旧版本仍在运行。只有在这完成后,回收才完成。

然而加载DLL的是让Web应用程序准备中的一部分,也可能有类似的装载/初始加载缓存的用户数据库等
这些行动是不是循环过程的一部分,他们发生毕竟DLL重新加载并且回收已经完成。

一段时间后,我遇到了一个应用程序,由于在启动过程中数据库活动/缓存过大而导致启动时间很长。所以我很感兴趣的是,如果有一些功能允许我们在回收标记为完成之前执行代码,那么应用程序首先会在所有内容都可以运行时被回收。基本上我想要的是某种分段功能。
我曾就此问题与IIS团队联系,不幸的是他们告诉我没有这样的功能存在,也没有计划

为了解决这个问题,你可以尝试做到以下几点:

  • 交替使用部署:
    你设置2个网站有独立的应用程序池。其中一个是LIVE网站,另一个是STAGED网站。如果您想部署更改,只需部署到STAGED网站即可。在加载/缓存所有内容之后,您可以切换Web应用程序的URL设置,以将传入请求从LIVE重新路由到STAGED。所以现场演出成为新的STAGED,而其他方式。接下来的部署将再次转到新的STAGED等等。

UPDATE
显然,他们已经创建了一个IIS模块,它现在提供了此功能:

IIS应用程序热身模块为IIS 7.5

的IIS团队已经发布了针对IIS 7.5的 应用程序预热模块的第一个beta测试版本。这使得您的应用程序变得比以前描述的更容易。自定义代码,而不是编写 自定义代码,而是指定要在网络应用程序接受来自网络的请求之前执行的资源的URL。在启动IIS服务期间(如果将IIS 应用程序池配置为始终运行)以及回收IIS工作进程 期间发生此热身活动 。在回收期间,旧的IIS工作进程继续执行请求,直到新产生的工作进程完全预热,直到完全 ,以便应用程序不会因未发生引用的高速缓存而中断或其他 问题。请注意,该模块可与任何版本的ASP.NET的 版本一起使用,从版本2.0开始。

有关详细信息,请参阅IIS.net Web站点上的应用程序预热。 有关演示如何使用热身功能的演练,请参阅 IIS.net Web站点上的IIS 7.5应用程序热身模块入门。

参见:

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

如果您使用ASP.NET 4自动启动功能:

您仍然可以选择自动从回收的工作进程时间到 时间。然而,当你这样做时,应用程序会立即重新启动,并执行你的预热代码(不像今天 - 你必须等待 下一个要做的事情)。

预热和自动启动功能的主要区别在于预热模块是回收过程的一部分。而不是在运行初始化代码时阻塞请求的应用程序。
只有使用自动启动功能才能得到的结果是,您不必等待用户点击该页面,这对您的情况无效。

见顾的博客文章:

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 7.5中,作为IIS 7的应用程序初始化模块。5 IIS 8后被释放:

http://www.iis.net/downloads/microsoft/application-initialization

+0

非常感谢您的意见,我了解,我需要移动我的缓存和预加载行动到一个进程外模式,我可以卸载一些应用程序的init工作,并实现“自动启动” ð终于等到了IIS8 :) – sam360 2012-03-12 12:32:08

+1

热身模块仍然存在于IIS 7.5的_Application初始化模块为IIS 7.5_: http://www.iis.net/downloads/microsoft/application-initialization – NicolasF 2012-11-07 13:47:08

5

ntziolis answer第一部分是凌晨一点不准确的。工作进程没有被回收或重新启动,它只是继续运行。如果是这种情况,那么在共享池环境中,每次部署新的网站时都会导致网站被淘汰。

当您部署新的ASP.NET应用程序时,它是该网站的“应用程序域”之内,工作进程被拆除,而不是池进程。

另外池回收是一个完全独立的概念,部署

在这个时间点在ASP.NET的商业生活中,在部署期间,网站将处于不一致的状态,直到所有的网站被部署。目前微软还没有关于单个服务器部署单个站点的好消息。

这就是为什么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?

+0

本来可以更精确在第一部分中,有一点是在再次阅读之后交叉部署+回收;)。不过,我认为他的问题是昂贵的应用程序启动代码,而不是实际的部署相关的,因此我专注于缺乏IIS 8之前的预热模块 – ntziolis 2012-03-12 02:28:42

相关问题