在IIS7中重新部署ASP.NET站点,而不使用正在干扰的文件

时间:2010-03-12 06:37:56

标签: c# asp.net iis iis-7

我们目前有一个进程可以重新部署ASP.NET网站。代码本身就是一个ASP.NET应用程序。当前的方法已经工作了很长时间,只需循环遍历一个文件夹中的所有文件,并将它们复制到webroot中的文件顶部。

出现的问题是偶尔文件最终被使用,因此无法复制。这在过去是间歇性的,无关紧要,但在我们的一些较高流量站点,它现在大部分时间都会发生。

我想知道是否有人有一种解决方法或替代方法,我没有想到。目前我的想法是:

  1. 只需重试每个文件,直到它正常工作。这会在很短的时间内导致错误,但这并不是那么好。
  2. 部署到新文件夹并将IIS的webroot更新到新文件夹。我不确定如何以管理员身份运行应用程序并运行批处理文件,这是非常不整洁的。
  3. 有没有人知道最好的方法是什么,或者如果没有像拥有管理员权限的用户那样运行发布应用程序就可以做#2(愿意授予它特殊权限,但我更愿意停止没有管理员)?

    修改
    基础设施的澄清......我们在一个NLB中有2个IIS 7网络服务器从共享NAS上运行他们的webroots(更清楚的是,他们在NAS上使用完全相同的webroot)。我们进行了大量的部署,以至于任何我们无法实现自动化的方法都无法实现。

6 个答案:

答案 0 :(得分:12)

您需要做的是暂时停止IIS处理该应用程序的任何传入请求,以便您可以复制新文件然后重新启动它。这将导致您的客户停机时间很短,但除非您的网站是关键任务,否则这不应该是一个大问题。

ASP.NET有一个feature that targets exactly this scenario。基本上,它归结为在webapp的根目录中临时创建名为App_Offline.htm的文件。一旦文件存在,IIS将删除您的应用程序的工作进程并卸载正在使用的任何文件。复制文件后,可以删除App_Offline.htm文件,IIS将很快再次开始搅拌。

请注意,当该文件存在时,IIS将提供其内容作为对您的webapp的任何请求的响应。所以要小心你放在文件中的内容。 : - )

答案 1 :(得分:2)

另一种解决方案是IIS程序化管理。

然后,您可以将新的/更新的Web复制到备用目录,然后将Web应用程序的IIS根目录切换到此备用目录。如果文件锁定在原始根目录中,则无关紧要。这是一个很好的网站可用性解决方案。

然而,它需要一些权限调整......

您可以通过IIS 6的ADSI或WMI或IIS 7的Microsoft.Web.Administration进行此操作。

关于您的2.,请注意WMI不像ADSI那样需要管理员权限。您可以按对象配置权限。检查您的WMI控制台(mmc)。

答案 2 :(得分:1)

由于您已经在2个Web服务器之间进行负载平衡,因此可以:

  1. 在负载均衡器中,使Web服务器A脱机,因此只有Web服务器B正在使用中。
  2. 将更新的站点部署到Web服务器A。
  3. (作为奖励,您可以在Web服务器A投入生产之前对其进行额外的测试。)
  4. 在负载均衡器中,使B脱机并将A置于联机状态,因此仅使用Web服务器A.
  5. 将更新的站点部署到Web服务器B.
  6. (作为奖励,您可以在投入生产之前在Web服务器B上执行额外的测试。)
  7. 在负载均衡器中,将B重新置于在线状态。现在,两个Web服务器都已升级并重新投入生产。
  8. 列表项

答案 3 :(得分:0)

在尝试复制文件之前,您还可以尝试修改根文件夹中web.config的时间戳。这将卸载应用程序和免费使用的文件。

答案 4 :(得分:0)

除非您手动打开Web服务器上文件的句柄,否则IIS不会对您的文件进行锁定。

尝试关闭可能锁定文件的其他服务。一些常见服务的例子:

  • Windows搜索
  • Google桌面搜索
  • Windows备份
  • 任何其他反病毒或索引软件

答案 5 :(得分:0)

我们有相同的服务器(2003)和相同的问题。某些dll被锁定,并将App_Offline.htm放入网站根目录,确实为我们做了杰克。

解决方案:

文件权限!

我们使用的是在网络服务帐户或IIS_WPG帐户下运行的网络服务,以便为网站部署更新。因此,它需要对所有文件进行写访问。我已经知道了这一点,并且之前已经在目录上设置了权限。但由于一些奇怪的原因,这个问题dll没有设置必要的权限。您不仅应该检查目录的权限,还要检查问题文件的权限。

我们为网络服务和IIS_WPG用户提供了对整个Web根目录的读/写访问权限,解决了我们正在使用的文件,文件锁定,超时和访问被拒绝的问题。