发布已在运行的 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 xunit 在 webapi 应用程序上运行 dotnet 测试