繁体   English   中英

如何在不停止 web 服务器的情况下在现有/正在运行的站点上更新 ASP.NET 核心应用程序?

[英]How can I update ASP.NET Core app over an existing/running site without stopping the web server?

我们有一个 ASP.NET 核心站点在我们的测试服务器上运行,我们希望通过 XCopy 自动部署到我们的 IIS web 服务器,因为我们已经运行了我们当前的应用程序, 我添加了一个发布配置文件,将站点打包到解决方案中的“本地发布”目录。 每当我尝试复制现有站点时,所有 DLL 都被另一个进程(可能是 Kestrel)使用,因此我被迫部署到同级目录并重新映射 IIS 以查看同级。 如何在无需手动干预和停止 Kestrel 或 IIS web 服务器的情况下更新正在运行的 ASP.NET 核心站点?

使用 IIS 运行时,您可以将名为app_offline.htm (区分大小写)的文件拖放到应用程序文件夹中。 IIS 将停止您的应用程序并提供app_offline.html文件的内容。 现在您可以复制您的应用程序。 完成后删除 app_offline.htm 和 IIS 将启动您的应用程序。 这在文档我关于使用 IIS 运行 Asp.NET Core 应用程序的帖子中进行了描述。

我们使用的一个小技巧是首先重命名旧文件(类似于my.dll.old ),然后复制新的 dll。 然后,您可以强制或等待应用程序池重新启动。

通常我会备份现有版本。 然后我几乎同时回收应用程序域(如果我使用的是 iis)并覆盖根文件夹的全部内容。 这样,应用程序将使用新版本的代码重新启动。 但它必须超级快,否则可能会出现问题。 如果出现任何故障,可以使用备份恢复到原始状态。

您可以使用 PowerShell 切换 IIS 站点/应用程序的物理路径:

($curPath = Get-WebFilePath -PSPath "IIS:\Sites\www.example.com\MyApp")
if ($curPath -like "*Blue*") {
    Copy-Item -Path "D:\inetpub\wwwroot\MyAppPath\Staging\*" -Destination "D:\inetpub\wwwroot\MyAppPath\Green" -Recurse -Force
    Set-ItemProperty IIS:\Sites\www.example.com\MyApp -name physicalPath -value "D:\inetpub\wwwroot\MyAppPath\Green"
} else {
    Copy-Item -Path "D:\inetpub\wwwroot\MyAppPath\Staging\*" -Destination "D:\inetpub\wwwroot\MyAppPath\Blue" -Recurse -Force
    Set-ItemProperty IIS:\Sites\www.example.com\MyApp -name physicalPath -value "D:\inetpub\wwwroot\MyAppPath\Blue"
}

使用您将新发布的文件复制到其中的临时文件夹。 然后,上面的脚本在绿色和蓝色文件夹之间切换。 您不必停止或回收您的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM