为大型 Web 应用程序(dll 大约 1mb)上传新 DLL 时,IIS 会抛出错误,因为 DLL 处于“使用中”状态,这意味着在上传 DLL 时网站已关闭。有没有办法阻止这种行为?
此外,虽然我使用的是 Web 应用程序,而不是网站,但每当我上传新的 DLL 时,重新上传后 IIS 仍然需要一段时间才能重新启动。我认为这种等待通常只适用于网站,因为它们需要由 IIS 编译,而不是 Web 应用程序?
为大型 Web 应用程序(dll 大约 1mb)上传新 DLL 时,IIS 会抛出错误,因为 DLL 处于“使用中”状态,这意味着在上传 DLL 时网站已关闭。有没有办法阻止这种行为?
此外,虽然我使用的是 Web 应用程序,而不是网站,但每当我上传新的 DLL 时,重新上传后 IIS 仍然需要一段时间才能重新启动。我认为这种等待通常只适用于网站,因为它们需要由 IIS 编译,而不是 Web 应用程序?
您可以将AAR与一些 Powershell 脚本一起使用,在同一台机器上进行零停机部署。
基本上你设置了 3 个站点。一个监听请求,将它们传递给 ARR,ARR 将它们重定向到其他 2 个站点之一。一次只有这 2 个站点中的一个处于活动状态。
部署时,您将新文件复制到停止的站点,对其进行预热,然后告诉 ARR 开始将请求转发到此节点,此时您可以使包含旧代码的站点脱机。
这个脚本几乎可以自动化这个过程。它假定以下文件/站点/webfarm 结构:
一旦你做出这样的改变,你就有效地改变了依赖关系。该站点需要在 ASP.NET 的卷影副本文件夹中重新编译。
更新:
根据您的评论:如果有人在电子商务网站上购买商品的同时推出了新的更新怎么办?它是我的 .NET 漏洞之一(我想念 php 的一件事是轻松上传 PHP 文件而无需麻烦)
如果您只有一台服务器,那么您需要计划更新并提前警告该站点由于升级而将不可用。ASP.NET 中有一个名为App_Offline.htm
. 这是一个特殊的页面,当它出现在您的应用程序中时,无论请求哪个页面,它都会导致 ASP.NET 呈现其内容。您可以使用它向用户显示一条消息,说明该站点已脱机以进行维护。您可以在 Scott Guthrie 的博客上阅读更多相关信息。
以这种方式进行站点升级并非不合理,因为它是一种在单个原子步骤中执行站点更新的机制,并为用户提供了他们不会介意的大量预先警告(并且可能在您的流量处于一个典型的低点)。
你提到在 PHP 中你不会有这个问题。实际上,如果您要更新的不仅仅是几个不相关的页面,那么您应该阻止用户在升级期间访问该站点。
假设您要更新五六个页面,所有这些页面都松散相关 - 可能是电子商务应用程序的一部分。在上传过程中,您部署第一个页面并将其提供给用户。您对此页面所做的更改之一是在表单中添加一个新字段。该页面回传到另一个使用该字段的 PHP 脚本。存在两种情况:
回发页面是新的,仍在您的上传队列中。这会破坏新上传的脚本,因为当用户单击提交时,没有可提交的内容。
回发页面已存在但尚未更新。此页面将表单发布字段写入数据库。您已将此新字段添加到数据库中,但它是必填字段,不能为空。您尚未更新的回发脚本尝试更新数据库,但会引发错误,因为新字段不在回发表单的 INSERT 语句中,因此为 null 导致违反 NOT NULL 约束。
我可以继续。如果您的站点提供的功能不仅仅是微不足道的功能,那么您应该离线进行所有更新,以确保您更新的所有代码都部署在单个原子更新中。