发布已在运行的 dotnet 应用程序

Posted

技术标签:

【中文标题】发布已在运行的 dotnet 应用程序【英文标题】:Publishing a dotnet application that's already running 【发布时间】:2017-03-16 14:10:28 【问题描述】:

我正在尝试创建一个脚本来简化发布 .NET Core 网站的过程。当我针对已经运行的服务器运行 dotnet publish 时遇到了问题。服务器是安装了 dotnet 包的 IIS,因此 IIS 使用其应用程序池来启动 dotnet。

这是我的批处理文件。我很乐意使用另一种脚本类型:

cd src/app
dotnet build --no-incremental
dotnet publish --framework netcoreapp1.0 --configuration Release --output ../../dist

当我运行脚本时出现此错误:

“该进程无法访问文件 'C:\inetpub\wwwroot\app\dist\app.dll',因为它正被另一个进程使用。”

这是有道理的,看来我需要停止、部署和重新启动 dotnet。我可以从脚本中做到这一点吗?还是我解决这个问题的方法有问题?

【问题讨论】:

发布不运行任何东西。你是如何运行应用程序的? C:\inetpub\wwwroot\ 是 IIS 的默认根文件夹。如果 Web 应用在 IIS 下运行,则必须使用 iisreset重新启动其应用程序池或 IIS 本身 @PanagiotisKanavos - 你猜对了。见编辑。重新启动应用程序池似乎有效。想要发布答案? 【参考方案1】:

最好的方法是将app_offline.htm 文件放到您的应用程序文件夹中。这将使 IIS 在您复制新版本时停止您的应用程序并将app_offline.htm 文件的内容提供给用户。完成复制应用程序的新版本后,删除 app_offline.htm 文件,IIS 将启动您的应用程序。 您可以在my post 中找到有关使用 IIS 运行 ASP.NET Core 应用程序的更多详细信息。

【讨论】:

【参考方案2】:

根据 Pawel 的回答,我有一个部署文件夹,其中包含我的 app_offline.html 文件和多个部署到 IIS 的脚本。这是我用来部署的示例脚本:

copy .\app_offline.htm C:\hosting\my-project\app_offline.htm
dotnet publish ../MyProject.csproj -r win-x64 -f netcoreapp2.1 --self-contained -c Release -o C:\hosting\my-project
del C:\hosting\my-project\app_offline.htm

【讨论】:

为避免here 中描述的嵌套发布文件夹问题,我建议在bin 文件夹中使用发布输出文件夹,例如dotnet publish ../MyProject.csproj -r win-x64 -f netcoreapp2.1 --self-contained -c Release -o C:\hosting\my-project\bin\Publish【参考方案3】:

我认为这是一个有效的解决方案,但在我想编写构建过程的脚本时没有帮助。

Stop-Website "xxx"
Stop-WebAppPool "xxx"
Start-Sleep -Seconds 5

dotnet publish --output d:\publocation

Stop-WebAppPool "xxx"
Start-Website "xxx"

【讨论】:

请解释您的解决方案如何解决 OP 的问题。 我发现如果我通过 IIS 管理控制台停止网站,那么我可以发布而不会出现文件句柄错误。所以我尝试编写网站的停止和启动脚本,从而最大限度地减少停机时间,并可能将构建安排在下班时间。诚然,我对此的结果喜忧参半,但我想知道是否包含一个 Stop-WebAppPool,我可能会拥有它。我将把它包括在内并报告我的情况。 更新了我的解决方案,因为我发现如果我编写停止网站和应用程序池的脚本,文件句柄问题就会消除。在考虑使用 app_offline.htm 的建议解决方案时,我敢打赌也可以编写脚本。我也想尝试一下。

以上是关于发布已在运行的 dotnet 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

发布后运行 dotnet core 控制台应用程序

使用 xunit 在 webapi 应用程序上运行 dotnet 测试

IIS Express 与 dotnet 运行 [重复]

在 Ubuntu 20.04 上运行 dotnet 应用程序

VB.Net SQLExpress 2008 部署

如何正确停止运行 dotnet core web 应用程序?