如何在 Windows 上更新 运行 asp.net 核心应用程序?
How to update a running asp.net core application on Windows?
我在带有 IIS 的 Windows Server 2008 R2 上有一个 Asp.Net Core MVC 应用程序 运行。但是每次更新这个应用程序,我都需要在IIS中手动停止applicationPool,更新完应用程序后重新启动applicationPool。否则它会告诉我 "the xxx.dll is in use by other progress".
有什么方法可以简化这个过程吗?
无法就地热交换 DLL。
最好的办法是每次都部署到一个新文件夹(例如版本控制的文件夹),并在将网站完全复制到服务器后更改 IIS 中的网站目录。
在编辑器中打开 web.config 文件并保存它会导致 Web 应用程序重新加载,即使您没有进行任何更改也是如此。所有 DLL 都应该是可替换的,直到用户访问该站点,导致 Web 应用程序重新启动。我有时会用它作为解决方法。
更完整的解决方案是使用 Web 部署,通过 Visual Studio 或命令行。这可能需要一点时间来设置,但提供了更多的自动化。
https://docs.microsoft.com/en-us/aspnet/core/publishing/iis#deploy-the-application-1
终于找到答案了:
我只需要将名为 app_offline.htm
的文件添加到 IIS Web 根目录(而不是您的项目 wwwroot 文件夹),并在替换所有文件后将其删除。
由于 this issue 你可能需要同时尝试 App_Offline.htm
或 app_offline.htm
.
这将允许您使用 FTP 客户端更新
对于 Windows 没有停机时间 并且我经常使用的解决方法是:
- 将 运行 .NET 核心应用程序 dll 重命名为 filename.dll.backup
- 上传新的 .dll(网络应用程序可用并在上传文件时处理请求)
- 上传完成后回收应用程序池。要么需要 RDP 访问服务器,要么需要在主机控制面板中回收应用程序池。
IIS 在回收时与应用程序池重叠,因此在回收期间通常没有任何停机时间。因此,在每个人都不知道应用程序池已被回收的情况下,请求仍然会进来,并且请求会在没有停机的情况下得到无缝处理。
我仍在寻找比这更好的方法..!! :)
2022 年 1 月 - Linux
对于 Linux,我们使用带有 Lua 脚本的 Openresty nginx 来保持(休眠)传入请求几秒钟,直到服务 运行 .NET Core 或 .NET 5 或 . Net 6 应用程序重新启动,然后我们释放我们持有的线程。
我在带有 IIS 的 Windows Server 2008 R2 上有一个 Asp.Net Core MVC 应用程序 运行。但是每次更新这个应用程序,我都需要在IIS中手动停止applicationPool,更新完应用程序后重新启动applicationPool。否则它会告诉我 "the xxx.dll is in use by other progress".
有什么方法可以简化这个过程吗?
无法就地热交换 DLL。
最好的办法是每次都部署到一个新文件夹(例如版本控制的文件夹),并在将网站完全复制到服务器后更改 IIS 中的网站目录。
在编辑器中打开 web.config 文件并保存它会导致 Web 应用程序重新加载,即使您没有进行任何更改也是如此。所有 DLL 都应该是可替换的,直到用户访问该站点,导致 Web 应用程序重新启动。我有时会用它作为解决方法。
更完整的解决方案是使用 Web 部署,通过 Visual Studio 或命令行。这可能需要一点时间来设置,但提供了更多的自动化。
https://docs.microsoft.com/en-us/aspnet/core/publishing/iis#deploy-the-application-1
终于找到答案了:
我只需要将名为 app_offline.htm
的文件添加到 IIS Web 根目录(而不是您的项目 wwwroot 文件夹),并在替换所有文件后将其删除。
由于 this issue 你可能需要同时尝试 App_Offline.htm
或 app_offline.htm
.
这将允许您使用 FTP 客户端更新
对于 Windows 没有停机时间 并且我经常使用的解决方法是:
- 将 运行 .NET 核心应用程序 dll 重命名为 filename.dll.backup
- 上传新的 .dll(网络应用程序可用并在上传文件时处理请求)
- 上传完成后回收应用程序池。要么需要 RDP 访问服务器,要么需要在主机控制面板中回收应用程序池。
IIS 在回收时与应用程序池重叠,因此在回收期间通常没有任何停机时间。因此,在每个人都不知道应用程序池已被回收的情况下,请求仍然会进来,并且请求会在没有停机的情况下得到无缝处理。
我仍在寻找比这更好的方法..!! :)
2022 年 1 月 - Linux
对于 Linux,我们使用带有 Lua 脚本的 Openresty nginx 来保持(休眠)传入请求几秒钟,直到服务 运行 .NET Core 或 .NET 5 或 . Net 6 应用程序重新启动,然后我们释放我们持有的线程。