3

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

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

4

2 回答 2

2

您可以将AAR与一些 Powershell 脚本一起使用,在同一台机器上进行零停机部署。

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

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

这个脚本几乎可以自动化这个过程。它假定以下文件/站点/webfarm 结构:

文件结构

  • 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-农场”
  • “$deploymentBlueNodeAddress”不可用
  • “$deploymentGreenNodeAddress”不可用
于 2013-03-04T11:40:48.687 回答
1

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

更新:

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

如果您只有一台服务器,那么您需要计划更新并提前警告该站点由于升级而将不可用。ASP.NET 中有一个名为App_Offline.htm. 这是一个特殊的页面,当它出现在您的应用程序中时,无论请求哪个页面,它都会导致 ASP.NET 呈现其内容。您可以使用它向用户显示一条消息,说明该站点已脱机以进行维护。您可以在 Scott Guthrie 的博客上阅读更多相关信息。

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

你提到在 PHP 中你不会有这个问题。实际上,如果您要更新的不仅仅是几个不相关的页面,那么您应该阻止用户在升级期间访问该站点。

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

  1. 回发页面是新的,仍在您的上传队列中。这会破坏新上传的脚本,因为当用户单击提交时,没有可提交的内容。

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

我可以继续。如果您的站点提供的功能不仅仅是微不足道的功能,那么您应该离线进行所有更新,以确保您更新的所有代码都部署在单个原子更新中。

于 2011-01-15T01:37:57.007 回答