如何在 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.htm
或app_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 未按预期运行