7

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

有什么方法可以让这个过程更容易吗?

4

4 回答 4

4

对于没有停机时间且我经常使用的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

于 2021-03-11T10:24:51.447 回答
3

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

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

于 2017-06-03T02:34:58.660 回答
1

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

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

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

于 2017-05-15T10:03:12.400 回答
0

没有办法对 DLL 进行热交换。

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

于 2017-05-13T20:40:26.683 回答