【问题标题】:Publishing/uploading new DLL to IIS: website goes down whilst uploading将新的 DLL 发布/上传到 IIS:网站在上传时出现故障
【发布时间】:2011-06-09 12:18:43
【问题描述】:

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

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

【问题讨论】:

  • @John Saunders - 应用程序、业务逻辑、数据访问或 UI 中的任何 dll
  • 从未在 .net dll 中看到过这种情况。确定不是 COM?

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


【解决方案1】:

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

更新:

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

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

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

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

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

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

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

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

【讨论】:

  • 所以没有办法解决这个问题?这对我来说似乎是一个很大的缺陷。如果有人在电子商务网站上购买商品的同时推出了新的更新怎么办?它是我的 .NET 错误之一(我想念 php 的一件事是轻松上传 PHP 文件而无需麻烦)
  • 谢谢凯夫。但是,我在一定程度上不同意。如果您要更改 3 个 php 文件,您可以快速上传这些文件而不会出现任何问题。如果您对 1 个 *.cs 文件也执行相同操作,则必须重新编译整个应用程序并上传。我知道共享托管服务提供商会缓存 dll,并且 dll 只有在您强制重新启动应用程序池时才会被 IIS 重新读取。我认为这可能是一个简单的选择,但也许不是。我可以做的另一件事是上传到临时文件夹,然后登录到服务器并复制 DLL。无论哪种方式,在维护多个网站时都会有点烦人。
  • @izip:上传到第二个站点怎么样?然后,一旦全部上传,您就可以切换这两个站点指向的物理文件夹。
  • 又是另一种选择,但并不是一个很好的解决方法。我感谢您的建议,并意识到对于大多数人来说这不是问题。但是对我来说,我每周定期维护/更新 20 多个项目。
  • @izip - 花时间解释了为什么会这样,并解释了为什么上传多个 PHP 或 ASP 脚本也会出现问题(即在部署期间的某个时间点,并非所有在上传完成之前,脚本处于相同的构建级别;您有可能破坏依赖关系,因为您在部署期间离开了您的站点)......您至少可以投票......甚至接受,因为它在技术上是正确答案?即使你不喜欢它:)
【解决方案2】:

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

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

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

This script 几乎可以自动执行此过程。它假定以下文件/站点/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”不可用

【讨论】:

猜你喜欢
  • 2022-06-26
  • 2016-02-16
  • 1970-01-01
  • 2020-09-05
  • 2016-01-08
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多