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

时间:2012-03-11 20:59:42

标签: asp.net iis-7 iis-7.5

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

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

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

提前感谢您的反馈!

2 个答案:

答案 0 :(得分:26)

IIS已经做到了这一点,这就是回收利用的全部内容。当旧版本的应用程序仍在运行时,IT正在加载DLL。只有在完成后才能完成回收。

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

前段时间我遇到了一个应用程序,由于启动时数据库活动/缓存繁重,启动时间很长。所以我感兴趣的是,是否有一些功能允许我们在回收标记为已完成之前执行代码,以便在一切准备好运行时首先考虑回收应用程序。基本上我想要的是某种升级功能 我在这个问题上与IIS团队保持联系,遗憾的是他们告诉我没有这样的功能,也没有计划

要解决此问题,您可以尝试执行以下操作:

  • 使用交替部署:
    您设置了2个具有单独应用程序池的网站。其中一个是LIVE网站,另一个是STAGED网站。如果要部署更改,只需部署到STAGED网站即可。在加载/缓存所有内容之后,您可以切换Web应用程序的URL设置,以将来自LIVE的传入请求重新路由到STAGED请求。所以LIVE一个成为新的STAGED而另一个方式。然后,下一次部署将再次转到新的STAGED,依此类推。

<强>更新
显然,他们已经创建了一个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网站。

见:

  

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

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

  

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

预热和自动启动功能的主要区别在于预热模块是回收过程的一部分。而不是在运行init代码时阻止应用程序的请求 只有使用自动启动功能才能获得的是,您不必等待用户点击页面,这对您的情况没有帮助。

参见顾的博客文章:

  

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发布后,预热模块重新用作IIS 7.5的 IIS 7.5的应用程序初始化模块

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

答案 1 :(得分:5)

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?