如何在 Windows 上更新正在运行的 asp.net 核心应用程序?

Posted

技术标签:

【中文标题】如何在 Windows 上更新正在运行的 asp.net 核心应用程序?【英文标题】:How to update a running asp.net core application on Windows? 【发布时间】:2017-10-12 13:45:15 【问题描述】:

我有一个在带有 IIS 的 Windows Server 2008 R2 上运行的 Asp.Net Core MVC 应用程序。但是每次更新这个应用程序时,我都需要手动停止 IIS 中的 applicationPool,并在更新完应用程序后重新启动 applicationPool。否则它会告诉我“xxx.dll 正在被其他进程使用”。

有什么方法可以让这个过程更简单吗?

【问题讨论】:

【参考方案1】:

我经常使用的Windows无停机时间的解决方法是:

    将正在运行的 .NET 核心应用程序 dll 重命名为 filename.dll.backup 上传新的 .dll(网络应用程序可用并在文件上传时为请求提供服务) 上传完成后,回收应用程序池。需要 RDP 访问服务器或功能以在您的托管控制面板中回收应用程序池。

IIS 在回收时会与应用程序池重叠,因此回收期间通常不会有任何停机时间。因此,请求仍然会在不知道应用程序池已被回收的情况下进入,并且请求可以无缝地提供服务而不会停机。

我仍在寻找比这更好的方法..!! :)

2022 年 1 月 - 适用于 Linux

对于 Linux,我们使用 Openresty nginx 和 Lua 脚本来保持(休眠)传入请求几秒钟,直到运行 .NET Core 或 .NET 5 或 .Net 6 应用程序的服务重新启动,然后我们释放我们持有的线程。

参考:https://github.com/basecamp/intermission

【讨论】:

如何在应用运行时重命名 dll?除非您的应用根本没有运行 我在 Windows 上执行此操作。你在说哪个操作系统?由于重命名文件使文件句柄保持有效。您是否对此进行了测试并遇到任何问题或无法重命名正在运行的 dll 或 exe ??【参考方案2】:

终于找到了我的答案: 我只需将一个名为app_offline.htm 的文件添加到 IIS Web 根目录(而不是您的项目 wwwroot 文件夹),并在替换所有文件后将其删除。 由于this issue,您可能需要同时尝试App_Offline.htmapp_offline.htm

这将允许您使用 FTP 客户端进行更新

【讨论】:

如果您将该文件添加到您的 Web 文件夹,应用程序将处于脱机状态,用户将只能看到该 html。我不认为这是一个解决方案。另一方面,您可以修改 web.config 而不更改任何值,应用程序将重新启动,但会话将丢失。 @daniherculano 更改 web.config 也会阻止您的 Web 应用程序停止,但不会阻止您的网站重新启动,所以如果您正在更新网站,并且有人访问您的网站,这不是一个可靠的解决方案(您的应用程序可能在您替换文件之前启动),app_offline.htm 将阻止您的站点启动,直到您将其删除(您可以添加一个小脚本来检测您的更新是否完成。例如使用 @ 987654327@查询状态码是503)。因此,当您有大量访问者或使用脚本更新您的网站时,这是一个更好的解决方案【参考方案3】:

在编辑器中打开 web.config 文件并保存它会导致 Web 应用程序重新加载,即使您不进行任何更改也是如此。所有 DLL 都应该是可替换的,直到用户点击该站点,导致 Web 应用程序重新启动。我有时会使用它作为解决方法。

更完整的解决方案是通过 Visual Studio 或命令行使用 Web Deploy。这可能需要一点时间来设置,但提供了更多的自动化。

https://docs.microsoft.com/en-us/aspnet/core/publishing/iis#deploy-the-application-1

【讨论】:

有没有关于如何使用 web Deploy 包的文章?我需要在服务器上做什么? 这是一篇关于如何在服务器上安装它的文章:docs.microsoft.com/en-us/iis/install/… 安装后,您可以在按发布时在 Visual Studio 中右键单击您的解决方案,然后从上一步。 我目前没有在win服务器上测试这个,我在我的客户端windows 7上测试,我使用web deploy package,即使我设置了“离线”,它仍然无法关闭网站规则”来启用。 :( @John 如果您使用进程外,您的应用程序的关闭可能需要比网络部署需要的时间更长(并且超过重试时间),通常,您的应用程序将有 5s 完成关闭处理并退出,但可能需要超过 15 秒(甚至退出过程失败),在这种情况下,网络部署尝试 5 次,每次等待 1 秒或 2 秒,因为您的应用仍在运行(未完成退出)和您的更新将失败。 @John 请尝试直接使用 web deploy 而不是 web deploy 包,【参考方案4】:

没有办法热插拔 DLL。

最好的办法是每次都部署到一个新文件夹(例如版本化文件夹),并在将网站完全复制到服务器后更改 IIS 中的网站目录。

【讨论】:

它仍然需要使用 IIS 控制台,并复制到一个新文件夹我会丢失我上传的图像。是否有一个 脚本 来停止 IIS 应用程序池,复制文件并启动 IIS 应用程序池 这样做您将丢失打开的会话

以上是关于如何在 Windows 上更新正在运行的 asp.net 核心应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

ASP程序在美国的英文Windows 2003操作系统下无法正常运行中文。

如何在运行任务后或在任务运行期间更新 Asp .Net 中的 UI?

Windows 更新后 System.Web.Mvc 未按预期运行

安装 Windows Update KB4340558 后,如何在经典 ASP 中正确实例化 32 位 COM 对象?

更新面板 AJAX asp.net 后运行脚本

如何使用javascript在asp.net上停止正在进行的回发(长时间运行)?