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

Iis 如何在现有/正在运行的网站上更新ASP.NET核心应用程序而不停止web服务器?,iis,asp.net-core,publish-profiles,Iis,Asp.net Core,Publish Profiles,我们有一个ASP.NET核心站点运行在我们的测试服务器上,我们希望通过XCopy自动部署到我们的IIS web服务器,就像我们当前的应用程序一样,我已经在运行该站点。我添加了一个发布配置文件,将站点打包到解决方案中的“publishlocal”目录中。每当我试图在现有站点上复制时,所有DLL都被另一个进程(可能是Kestrel)使用,因此我被迫部署到同级目录,并重新映射IIS以查看同级。如何更新正在运行的ASP.NET核心站点而不必手动干预和停止Kestrel或IIS web服务器?我们使用的一

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

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

使用IIS运行时,您可以将名为
app\u offline.htm的文件(区分大小写)放到应用程序文件夹中。IIS将停止您的应用程序并提供
app\u offline.html
文件的内容。现在您可以复制您的应用程序。完成后,删除app_offline.html,IIS将启动您的应用程序。这在中有描述,在使用IIS运行Asp.NET核心应用时也有描述。

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

我正在尝试使用MSBUILD和TeamCity编写复制到web服务器的脚本。Kestrel不阻止重命名吗?如果文件正在使用,它们肯定不允许重命名。您可以重命名实际正在使用的文件。@No。重命名正在使用中的GAC DLL时Windows也没有。很遗憾,MSBUILD没有重命名选项,但我会给您一个提示,因为我没有指定MSBUILD。即使使用app_offline.htm,yourwebsite.exe仍在使用中,您无法复制新版本。使用app_offline.htm和应用程序池重置后,看起来您可以复制您的website.exe,但仅仅将app_offline.htm置于离线状态是不够的。我的理解是,将app_置于离线状态是足够的。IIS尝试优雅地停止您的应用程序,因此如果有挂起的请求,停止应用程序进程可能不会立即停止。如果你在将app_offline.html放在离线状态后没有看到应用程序停止,我建议在这个repo中打开一个问题:我也这么认为,但这是我现在遇到的一个问题。在我的TFS构建中,我有一个powershell脚本,它将app_offline.htm放入其中,等待几秒钟,向IIS提交请求,并返回一个503错误,显示应用程序处于脱机状态……但mywebsite.exe仍被锁定以进行编辑,并且dotnet发布失败。:(我想我会向你建议的回购提交一个问题,因为我同意-app_offline.htm应该足够好了。这对我来说很有效。通过将app_offline.html放在一起,我最终可以使用被动ftp发布我的应用程序,而不必先停止IIS服务器。@FerX32你应该将.html修改为.htm。我使用html插件已经被烧坏了好几次了。)htm的替代品。