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