IIS发布ASP.NET核心应用程序而不关闭IIS网站

ie3xauqp  于 2023-07-01  发布在  .NET
关注(0)|答案(4)|浏览(132)

当前设置

我们目前将我们的ASP.NET Core产品部署到:

  • Windows Server 2016
  • 托管在IIS版本10.0.14393.0上

我们有一个单一的“网站”与多个应用程序下。每个应用程序都使用自己的应用程序池,并Map到不同的物理文件夹路径位置。
每个应用程序都由其自己的源代码ASP.NETCoreServer项目表示

IIS结构

问题

我们使用Jenkins作为CI/CD,这是无法更改的。我们有PowerShell脚本与IIS交互
没有IIS命令来停止应用程序,只有一个站点,但理想情况下,我们不希望在发布单个应用程序的新版本时关闭站点。我们只想降低这个特定的应用程序。
我们尝试通过停止与应用程序关联的WebAppPool,然后等待(2分钟)来实现此目的。然后5分钟)。但即使在此之后,应用程序文件仍然被锁定。
我们最终会关闭WebAppPool和站点以释放文件,以便可以替换它们。
”””我知道有一个更好的方法来做这件事。我们如何才能关闭一个单独的应用程序,并防止新的请求到达它,以便我们可以替换文件,然后重新启动它?而“网站”及其下的任何其他应用程序未被更新仍在运行。我不介意下载应用程序更新的时间。**

更新6/8/2022

标签:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/app-offline?view=aspnetcore-6.0
我想看看这是否能解决我的问题。

kgsdhlau

kgsdhlau1#

在应用程序的根文件夹中添加名为app_offline. htm的文件应强制ASP.NET Core Module关闭应用程序并停止处理传入请求。然后,您应该能够部署新文件,而不会影响其他应用程序。

wlzqhblo

wlzqhblo2#

下面是我使用蓝/绿色策略的方法:
首先,我在服务器上创建了这个文件夹结构:

D:\inetpub\wwwroot\MyAppPath\
  Staging
  Green
  Blue

接下来,在IIS中,我将应用程序的物理路径指向D:\inetpub\wwwroot\MyAppPath\绿色
然后我创建了D:\inetpub\wwwroot\MyAppPath\SetAppPath.ps1

($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"
}

然后,我创建了一个运行SetAppPath.ps1的不带触发器的任务(SetMyAppPath
在我的开发工作站上,我在项目根目录下创建了deploy.ps1:

param ($buildType)
net use r: /delete
dotnet publish --configuration $buildType
net use R: "\\111.222.333.444\d`$" /user:"MyAdminUser" "MyAdminPassword"
Copy-Item -Path "C:\Users\MyUser\Dir1\Dir2\Dir3\MyProject\bin\$buildType\netcoreapp3.1\publish\*"  -Exclude web.config,appsettings.json,appsettings.Development.json -Destination "R:\inetpub\wwwroot\MyAppPath\Staging" -Recurse -Force
schtasks /RUN /S \\111.222.333.444 /U MyAdminUser /P MyAdminPassword /tn SetMyAppPath
net use r: /delete

然后,为了部署,我运行.\Deploy Debug或.\Deploy Release
因此,当我准备部署一个新版本时,文件被复制到服务器上的staging文件夹。然后,触发服务器上的任务,该任务将暂存文件复制到绿色或蓝色文件夹中,这些文件夹永远不是当前文件夹。
最后,应用程序路径被更新到绿色或蓝色文件夹,这不是当前文件夹。
很管用。

cnwbcb6i

cnwbcb6i3#

我强烈建议在IIS中使用web deploy。有几个步骤来设置它,但一旦配置它真的工作得很好。
如果以这种方式发布,它将自动执行以下操作:

  • 继续接受传入请求,但暂停它们
  • 优雅地停止旧版本的应用程序
  • 回收应用程序池
  • 启动应用程序的新版本
  • 暂停的请求将恢复到应用程序的新版本

此解决方案使您能够部署新版本,而不会对您的服务造成可察觉的中断,而其他解决方案可能会使您的服务在发布期间无法访问。
我只使用了Visual Studio中的发布菜单,但应该可以从CI/CD脚本调用msbuild.exe作为described here。(链接描述了TeamCity的解决方案,但应该可以适应Jenkins)

xam8gpfp

xam8gpfp4#

我以前成功地将IIS中的站点指向符号链接。然后,符号链接又指向保存网页内容的文件夹。
每当我必须更新网页时,我都会创建一个新文件夹,让我们称之为webpage_date,然后更新符号链接并将其指向新文件夹。最后,我回收了负责网页的AppPool。
所以它会这样:
symlink -> webpage_1
将更新网页的文件夹放在旁边,称之为webpage_2。指向它的符号链接:
symlink -> webpage_2
然后回收AppPool。
这使得有可能有一个相当低的停机时间。
用于Restart-WebAppPool的PowerShell命令:

Restart-WebAppPool -Name "YourAppPool"

Restart-WebAppPool documentation
符号链接可以用

New-Item -ItemType SymbolicLink -Path .\link -Target .\Notice.txt

Powershell New-Item Symlink文档

相关问题