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

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

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

【问题讨论】:

    标签: asp.net-core iis deployment redeploy


    【解决方案1】:

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

    1. 将正在运行的 .NET 核心应用程序 dll 重命名为 filename.dll.backup
    2. 上传新的 .dll(网络应用程序可用并在文件上传时为请求提供服务)
    3. 上传完成后,回收应用程序池。需要 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 应用程序池
    • 这样做您将丢失打开的会话
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多