将新DLL发布/上传到IIS:网站在上传时关闭

时间:2011-01-15 01:33:17

标签: asp.net iis web-applications web-deployment

当为大型Web应用程序上传新的DLL(dll大约为1mb)时,IIS会抛出错误,因为DLL是“正在使用”,这意味着在上载DLL时网站已关闭。有没有办法阻止这种行为?

此外,虽然我使用的是Web应用程序,而不是网站,但每当我上传新的DLL时,IIS重新上传后仍需要一段时间才能重新启动。我认为这种等待通常只适用于网站,因为它们需要由IIS编译,而不是Web应用程序?

2 个答案:

答案 0 :(得分:2)

您可以将AAR与一些Powershell脚本一起使用,以便在同一台计算机上实现零停机。

基本上你设置了3个站点。一个人听取请求,将它们传递给ARR,ARR将它们重定向到其他两个站点之一。这两个站点中只有一个一次处于活动状态。

部署时,将新文件复制到已停止的站点,预热,然后告诉ARR开始将请求转发到此节点,此时您可以使旧代码脱机的站点。

This script几乎可以自动完成此过程。它假定以下文件/站点/ webfarm结构:

File Strcuture

  • C:\ PATH_TO_YOUR_CODE \ $ projectName(此文件夹包含要部署的文件)
  • C:\ PATH_TO_YOUR_CODE \ $ projectName-Green(开始时可以为空 - 激活此节点时将复制部署文件)
  • C:\ PATH_TO_YOUR_CODE \ $ projectName-Blue(可以为空开头 - 激活此节点时将在此处复制部署文件)

IIS站点

  • “$ projectName”(ARR网站)正在运行
  • “$ projectName-Green”(平衡网站绿色)已停止
  • “$ projectName-Blue”(平衡网站蓝色)已停止

网络农场

  • “$ projectName-Farm”
  • “$ deploymentBlueNodeAddress”不可用
  • “$ deploymentGreenNodeAddress”不可用

答案 1 :(得分:1)

一旦你做了这样的改变,你就有效地改变了依赖性。该站点需要在ASP.NET的卷影副本文件夹中重新编译。

<强>更新

根据您的评论:如果有人在推出新更新的同时在电子商务网站上购买商品,该怎么办?它是我的.NET漏洞之一(我想念php的一件事就是轻松上传PHP文件而没有麻烦)

如果您只有一台服务器,那么您需要计划更新并提前警告该网站因升级而无法使用。 ASP.NET中有一个名为App_Offline.htm的功能。这是一个特殊页面,当您的应用程序中出现时,无论请求哪个页面,都会导致ASP.NET呈现其内容。您可以使用此消息显示一条消息,向用户解释该站点处于脱机状态以进行维护。您可以阅读更多相关信息here on Scott Guthrie's blog

以这种方式进行站点升级并不是不合理的,因为它是一种在单个原子步骤中执行站点更新的机制,并且为用户提供了他们不会介意的大量提前警告(并且可能在您的时候执行此操作)交通处于典型的低点。)

你提到在PHP中你不会遇到这个问题。实际上,如果您要更新几个不相关的页面,那么您应该阻止用户在升级过程中访问该站点作为一个问题。

假设您正在更新所有松散相关的五六页 - 可能是电子商务应用程序的一部分。在上传过程中,您将部署第一页并将其提供给用户。您对此页面所做的更改之一是向表单添加新字段。该页面回发到另一个使用此字段的PHP脚本。存在两种情况:

  1. 回发页面是新的,仍然在您的上传队列中。这会破坏新上传的脚本,因为当用户点击提交时,无需提交任何内容。

  2. 回发页面已存在,但尚未更新。此页面将表单发布字段写入数据库。您已将此新字段添加到数据库,但它是必填字段,不能为空。您尚未更新的回发脚本会尝试更新数据库,但会引发错误,因为新字段不在回发表单的INSERT语句中,因此为null会导致违反NOT NULL约束。

  3. 我可以继续。如果您的站点提供的功能不仅仅是一小部分功能,那么您应该脱机进行所有更新,以确保所有您更新的代码都部署在单个原子更新中。