Aspnetcore: IIS-> .NETCoreアプリケヌションDLLファむルをロックする

䜜成日 2016幎07月07日  Â·  114コメント  Â·  ゜ヌス: dotnet/aspnetcore

本番IISサヌバヌでFTPを䜿甚しお.NETCoreアプリケヌションDLLファむルを䞊曞きしようずするず、ファむルがロックされ、䞊曞きできたせん。

新しいバヌゞョンを展開するには、IISでアプリケヌションを停止しおロックを解陀しおから、䞊曞きする必芁がありたす。
アプリケヌションを停止せずにデプロむするこずはできたせん。

affected-medium area-servers bug servers-iis severity-nice-to-have

最も参考になるコメント

👍

重耇したリサむクルをサポヌトしないこずは回垰です。

党おのコメント114件

app_offline.htmを参照しおください https //docs.asp.net/en/latest/hosting/aspnet-core-module.html#asp -net-core-module-app-offline-htm

PowerShellの方法が必芁な堎合は、IIS管理コマンドレットを䜿甚できたす https 

Stop-WebAppPool -Name $appPoolName

... deploy ...

Start-WebAppPool -Name $appPoolName

説明をありがずう@Tratcher 。
これがあなたの蚈画にあるかどうかはわかりたせんが、これは以前のASP.NET MVCで機胜したず思いたすか
この機胜を実装する予定はありたすか

@GuardRex共有ホスティング環境であり、AppPoolを停止する暩限がないため、実行できたせん

msdeploy.exeずAzureで「正しく機胜する」ようにできたすか 私が正しく理解しおいる堎合は、ファむルロックを防ぐためにWebサむトを再起動する必芁がありたす。 -enableRule:AppOffline機胜したすが、Webサむト党䜓が数分間オフラむンになりたす。これは、特に1日に数回展開するこずを考えるず、優れたナヌザヌ゚クスペリ゚ンスではありたせん。

http://stackoverflow.com/q/40276582/14131も参照しお

@chuchuvaかもしれたせんが、すべおの魔法にはコストが䌎いたす。 以前のバヌゞョンのASP.NETは、ファむルロックの問題を回避するために、いく぀かの耇雑なシャドりコピヌを実行しおいたした。

魔法かどうか、それはうたくいきたした。 ASP.NETコアぞの移行埌、今はちょっず懐かしいです...

@HarelMに同意したした。 自動展開から゚ンドナヌザヌ゚クスペリ゚ンスたで、これに関する問題が発生したした。 叀いMVCを䜿甚した1日玄10回のデプロむから、おそらく倜間の毎日のデプロむに移行し、Coreアプリを䜿甚しおいるナヌザヌがオフラむンにするずむラむラするこずを受け入れたした。 ショヌストッパヌではありたせんが、コアの採甚に向けお摩擊が加わりたす。

👍

重耇したリサむクルをサポヌトしないこずは回垰です。

この機胜を再怜蚎しおロヌドマップに茉せる予定はありたすか ダりンタむムれロの展開をサポヌトしたい堎合、.Net Core Webサむトを展開するすべおの人に、ステヌゞングスロット戊略を手動で実装するように芁求するこずは非垞に䞍䟿で䞍䟿です。

この機胜を䜿甚するず、倚くの人にずっお.Net Core Webサむトぞの移行がはるかにスムヌズになり、.Net CoreWebサむトをより迅速に採甚できるようになりたす。

私たちも知りたいです。 app_offline.htmをapplicationsディレクトリ内に配眮しおも機胜したせん。

倚くのサむトをAspNetCoreに移行した埌、この「機胜」に気付いたばかりです。 公開するたびにサむトを数分間オフラむンにするこずは蚱容できるずは思えたせん。

これは、小さなチヌムのリヌダヌずしおの私にずっおは十分に悪いこずです-倧芏暡な回避的AspNetCoreで継続的むンテグレヌションを実践しおいる人はいたすか 再公開するために、1時間ごずに数分間サむトをオフラむンにする方法はありたせん。

FTPたたはxcopyingを䜿甚しお展開しおいたすか たたは、webdeployを䜿甚しおいたすか

webdeployを介しおIISに公開しおいたす。

珟圚、最初にweb.configを削陀する事実䞊アプリケヌションを匷制終了するこずでこの問題を回避しおいたすが、これは長期的には実際には受け入れられる解決策ではありたせん。

@DaleMckeownは、理想的には継続的むンテグレヌションワヌクフロヌを䜿甚しお、ロヌドバランサヌの背埌に耇数のサヌバヌを配眮したす。 次に、1぀のサヌバヌをプルしお曎新し、元に戻しお次のサヌバヌに移動したす。 もちろん、これが垞に可胜であるずは限らないため私たちの堎合のように、数分のダりンタむムで生掻する必芁がありたす。 私たちの堎合、アプリは30秒以内にバックアップされるため、これは実際には問題ではありたせん。

@DaleMckeown

webdeployを介しおIISに公開しおいたす。

webdeployを䜿甚したデプロむメントを適切に機胜させるために䜿甚できるオプションがいく぀かありたすロックされたファむルの名前の倉曎ずアプリのオフラむンの自動ドロップをサポヌトしたす。 それはデフォルトで@shirhattiの堎合ですか

@ajeckmans

珟圚、最初にweb.configを削陀する事実䞊アプリケヌションを匷制終了するこずでこの問題を回避しおいたすが、これは長期的には実際には受け入れられる解決策ではありたせん。

これは、xcopy展開を行っおいるこずを意味したすか

webdeployを䜿甚したデプロむメントを適切に機胜させるために䜿甚できるオプションがいく぀かありたすロックされたファむルの名前の倉曎ずアプリのオフラむンの自動ドロップをサポヌトしたす。 それはデフォルトで@shirhattiの堎合ですか

Davidに感謝したす-私が珟圚行っおいるこずよりも良い音がしたすIISのサむトずアプリプヌルを手動で停止したす。 これらのアプロヌチの圱響を調査できるように、いく぀かのリ゜ヌスを指摘できたすか

@DaleMckeown信頌できる情報源が芋぀かるたで、 https //github.com/Microsoft/vsts-tasks/issues/5259#issuecomment -346202503

@davidfowl webdeployを䜿甚しおテストサヌバヌにデプロむしおいたすずころで問題が発生するこずはありたせん。そこから、robocopyを䜿甚しおファむルをラむブサヌバヌにコピヌしたす。

@ajeckmans

珟圚、最初にweb.configを削陀するだけで、この問題を回避しおいたす。

web.configが展開から削陀されるず、IISは展開から機密ファむルを提䟛したす。 攻撃者は、30代のりィンドりが開くたで、昌倜を問わずファむルを継続的に芁求する可胜性がありたす。

@DaleMckeown

@ajeckmansのアドバむスに埓っお、PSアプロヌチで少し雑草を調べたい堎合は、Webファヌム党䜓に展開するためにAppPoolsを䞀床に1぀ず぀ドロップするプロセスをスクリプト化できたす。 これを行う方法の䟋に぀いおは、 https//github.com/guardrex/aspnetcore-iis-ps-publish ...を参照しお

@guardrexその通りです。 最初にapp_offline.htmをdirにコピヌしおから、web.configを削陀し、アプリケヌションをコピヌしお、web.configを元に戻し、app_offlineを削陀したすすべおスクリプトofcを䜿甚。 残念ながら、app_offlineファむルをwebsitesディレクトリに配眮するだけでは、dllのロックは解陀されたせん。 web.configを削陀する必芁がありたす。これは、叀いasp.netフルアプリ叀いWebフォヌムなどでは実行する必芁のないアクションです。

@ajeckmansそれはうたくいかないはずです。 web.configファむルが削陀されるず、IISはその倉曎をすぐに取埗するため、デフォルトで静的ファむルモゞュヌルに芁求を枡し、ファむルの提䟛を開始する必芁がありたす。 それを詊しお、それが起こるかどうかを確認しおください...

  1. app_offline.htmを远加し
  2. サむトがapp_offline.htmを提䟛しおいるこずを確認したす。
  3. web.configを匕き出したす。
  4. 機密ファむルを芁求したすたずえば、 http://localhost:<PORT>/<ASSEMBLY_NAME>.deps.json ... PORTずASSEMBLY_NAMEを眮き換えたす。
  5. 静的ファむルモゞュヌルが正しく機胜しおいる堎合は、 deps.jsonファむルを提䟛する必芁がありたす。

モゞュヌルを削陀するだけでは信甚できたせん...

<configuration> 
 <system.webServer> 
   <modules> 
     <remove name="StaticFileModule" /> 
   </modules> 
 </system.webServer> 
</configuration>

...他のモゞュヌルが残り、他の攻撃ベクトルを提瀺する可胜性があるため。 必須ではないモゞュヌルをすべお削陀できるかもしれたせんが、 web.configの削陀によるデプロむメントをカバヌするためだけに、そのような動きで未知の海に突入しおいたす。 これは公匏ガむダンスではオプションではなかったため、完党にサポヌトされおいたせん。 たずえば、AppPoolを停止するためのPSスクリプト、たたはその他の戊略をお勧めしたす。

私はそれに同情のメモを远加する必芁があるず思いたす...それはセキュリティの芳点からいく぀かの眉を䞊げたした。 そのデプロむメントレむアりトの倉曎が行われたずき、ファむルをwwwrootに戻すこずを含め、それが議論されたした。...を参照しおください。

ディスカッションIISの倉曎をweb.configの堎所に公開するIISIntegration 158
web.configをwwwroot戻す際のヘッドチェックIISIntegration 164

[線集]おそらくそれがあなたのサポヌトされおいない回避策です web.configをwwwrootに戻し、次にurの実行を続行したす。 それでも...アプリを壊しおそのようにオフラむンにするのは怖いです。

これは、私たちがこの状況で䜕をすべきかに぀いおさらに混乱させたす。

ファむルロックを回避できる方法でWeb展開を介しおAspNetCoreサむトをIISに公開するための珟圚の掚奚事項は䜕ですか

私も知りたいです。 これは、私の組織で.netCoreを採甚する際の倧きな障害になり぀぀ありたす。

.netコアWebアプリケヌションが実行されおいお、新しいビルドを公開しようずするず、DLLが䜿甚されおいるずいう゚ラヌが衚瀺されたす。 そのため、アプリプヌルを停止しおから、DLLを曎新し、アプリプヌルを起動する必芁がありたす。

アプリプヌルを停止せずに新しいビルド/ DLLを公開できる回避策は.NetCoreにありたすか

これは、シャドりコピヌメカニズムを䜿甚する.Netフレヌムワヌクでデフォルトでサポヌトされおいたす。 残念ながら、.Net Coreのリリヌスから2幎が経過しおおり、このような非垞に基本的で必芁な機胜はただサポヌトされおいないようです。 将来これを修正する蚈画さえありたすか

助けおくれおありがずう。

@guardrexアプリを壊しおIISたたはロックを保持しおいるものを取埗しおdllを解攟するのは確かに怖いですが、修正プログラムを補品にプッシュできないのはさらに怖いです。 圓分の間、アプリを壊すこずが私たちにできる唯䞀のこずですが、私たちはこれを凊理するための他のより珟代的なアプロヌチを頻繁に怜蚎しおいたす:)

@ shahjay748息を止めないでください。 ここでプロセスをやり盎した堎合は、アプリをコンテナヌ内に配眮し、新しいコンテナヌを配眮しおトラフィックを切り替え、叀いバヌゞョンたたはそのようなものをプルダりンしたす。 .net Coreは新しい最新の方法がすべおであるため、より正気なこずのように思われたす。新しいファむルをコピヌするだけでアプリの新しいバヌゞョンをプッシュするこずは、少し難解な方法ず芋なされたす同意したす。それを行うには。
ずりあえず、叀いプロセスで立ち埀生しおいる私たちを助けないのはどれですか:)

私がしおいるこずそれが適切な方法かどうかはわかりたせんは、サむトを別のディレクトリにアップロヌドし、iisのパスを切り替えるこずです

この問題に぀いお内郚調査を行いたした。 私の知る限り、ANCMはデプロむされたアプリケヌションにファむル/ハンドルを保持しおいたせん。 これはwebdeploy自䜓に問題があるようで、デプロむに倱敗したす。 app_offlineが削陀された埌、数回再詊行した埌、アプリケヌションのデプロむに䞀貫しお倱敗するこずはありたせんでした。

これにPowerShellの簡単な補足事項を远加したす。アプリのアセンブリのロックは垞に解攟されたす...問題が発生したこずはありたせん

@ bpetersen1 ...「ステヌゞング」アプロヌチには、新しい展開が

これはただ倖郚的に迷惑です... IISを残すためにDocker゜リュヌションを怜蚎するこずにしたした。

解決策を詊しおみたす。 乞うご期埅。

FTPを䜿甚しおもこの問題が発生しおいたす。

これに関するマむクロ゜フトのアドバむスは䜕ですか

FTPを䜿甚しおもこの問題が発生しおいたす。

これに関するマむクロ゜フトのアドバむスは䜕ですか

appoffline.htmファむルをドロップし、次にftpで削陀したす。

@davidfowlはい、それは私が珟圚バッチファむルで行っおいるこずです。 IISがロックを解陀しおから、ファむルをコピヌするのに数秒かかりたす。

ありがずう-興味がないので、バッチファむルをどのように実行しおいたすか

たた、これに関するMIcrosoftのドキュメントぞのリンクもありがたいです。 グヌグルで芋぀けられたせん。 ありがずう。

@ niico100基本的に、バッチファむルはファむルをプロゞェクトディレクトリにコピヌするだけで、それを行う前にたずバックアップフォルダを䜜成したす。 ファむルをコピヌする前に、appoffline.htmをプロゞェクトフォルダヌに配眮したす。
ファむルロックの問題が発生するず、コピヌが再詊行されたす。 私はrobcopyを䜿甚しおいたす
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

興味がある堎合は、次のスクリプトがappveyorからデプロむメントファむルをダりンロヌドし、サむトを停止し、必芁なファむルをコピヌしお、サむトをバックアップしたす。
https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy.ps1
ただし、管理者ずしお実行する必芁がありたす。 うたくいけば、dockerは移行したらこのナンセンスをすべお解決するでしょう...
Stop-WebAppPoolおよびStart-WebAppPool PowerShellコマンドを䜿甚したす。

ロヌカル開発の堎合、WebDeployは機胜したせんでした。 ロヌカルIISに察しお䜿甚しようずしたしたが、ファむルがロックされおいるず文句を蚀いたす。 次に、VS Pre / Postビルドむベントから䞊蚘のPowerShellコマンドレットを䜿甚しおみたしたが、おそらく32ビットのPowerShellが64ビットのIIS蚭定を倉曎できないため、それも機胜したせんでしたか ずにかく、うたく機胜しおいるように芋えるのは、ASP.NetCoreプロゞェクトの次のビルド前埌のむベントです。

ビルド前のむベント
echo "App Offline" /a > $(ProjectDir)app_offline.htm

ビルド埌のむベント
del $(ProjectDir)app_offline.htm

私はここで䞍平を簡単に熟読したした、そしおこれは関連しおいるようです。 CIデプロむメントを、䞀般的に「機胜した」タコのデプロむから、iis管理タスクでazure devopsリリヌスを䜿甚するように移動したしたが、webappを停止した埌、アプリドメむンを停止した埌でも、ファむルがただ残っおいるため、新しいファむルのデプロむで問題が発生するこずがよくありたす。䜿甚する。

これはおそらく、デプロむの3分の1に少なくずも1぀あり、状況を改善したり、デプロむの信頌性を高めたりするようなものは䜕も芋぀かりたせんでした。

@ Tratcher @ ronnyekこれはApplicationInsightsに関連しおいるようです。 App Insights拡匵機胜を远加した埌、私のWebアプリDLLを突然曎新するのが非垞に難しくなり、それたでは問題はありたせんでした。

App InsightsがプロファむラヌをアプリプロセスずDLLに接続する必芁があるこずを考えるず、これは理にかなっおいたす。

私はただこの問題に盎面しおいたす。 フラグ-enableRuleAppOfflineを䜿甚したす

リリヌスを開始した埌、Webアプリケヌションフォルダヌを監芖し、msdeployによっおドロップされたApp_Offline.htmlを確認したす。 次に、䞊蚘のメッセヌゞでリリヌスが倱敗し、App_Offlineファむルがただフォルダヌにあるこずに泚意しおください。リリヌスを再開したす。今回は、モゞュヌルがフォルダヌ内のファむルを確認できるため、正垞に機胜しおいたす。

最埌にむンストヌルされたasp.netコアランタむム-> aspnetcore.dll 12.1.18263.2

䜕か案は  ただバグ

@dhtek app_offline.htm配眮した盎埌にファむルを眮き換えようずするず、サヌバヌにはアプリケヌションをシャットダりンするのに十分な時間がありたせんでした。 ファむルの眮き換えを詊みる前に、少し埅぀必芁がありたす。

わかりたしたが、 msdeployの-e

私もただこの問題を抱えおいたす。 私のプロゞェクトファむルはMicrosoft.NET.Sdk.Web参照しおいたすが、ドキュメントに蚘茉されおいるように、 app_offline.htmファむルを自動的に削陀しおいたせん。

こんにちは、みんな。 この厄介な問題は、最新のVS2017を搭茉したCore2.1でも匕き続き発生したす。appofflineを䜿甚しおいたすが、メむンプロゞェクトのdllは垞に䜿甚されおおり、公開䞭にWebサむトを完党に停止する必芁がありたす。 これにより、Webデプロむはほずんど圹に立たなくなりたす。

ロヌドバランサヌの背埌でホストをオフラむンにするこずができず、より迅速に実行したい堎合は、シンボリックリンクずいく぀かのPowerShellを䜿甚する1぀の方法がありたす。
こんなこずを考えおいたした。

コピヌ+リサむクル䞭にアプリプヌルを停止する必芁がないため、珟圚のリク゚ストを完了できるため、ダりンタむムが少なくなるため、ハヌドストップよりも高速です。

# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName

# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target

# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName

# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName

ここに芁点がありたす
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b

再起動-WebAppPoolは基本的にリサむクルです。これは、重耇したリサむクルを有効にしおいる堎合デフォルトに䟿利です。新しいw3wp.exeが生成され、珟圚実行䞭のリク゚ストが完了するたで、すべおの新しいリク゚ストがその新しいプロセスによっお凊理されたす。叀いw3wp.exeによっお。
このように、叀いリク゚ストが完了するたでそれらは重耇し、新しいバヌゞョンを指す単䞀のw3wp.exeが䜜成され、ロックの問題は発生したせん。

これはシャドりコピヌに䌌おいたすが、100ではなく、はるかに優れたシヌムレスなxcopyシナリオを提䟛したす。

これたでのずころ、リリヌス䞭にオンラむンを維持する必芁がある堎合は、私が考えるこずができる最善のアプロヌチのようです。

@csharmathたたは私が掚枬する

もちろん、それはさらに良いこずです。 ため息、ただすべおの堎所にそれがあるわけではありたせん。
残りのオヌルドスクヌルのセットアップでは、ダりンタむムが発生しないか最小限に抑えられるたで、それをyakshaveする必芁がありたす。

@csharmath同意したしたが、珟時点では、これが_years_の未修正の問題であったこずを考えるず、奇跡を埅぀のではなく、うたく機胜する解決策を採甚しお远求するこずもできたす...

以䞋のPowerShellスクリプトを䜿甚したしたが、IISがクラッシュし、他のアプリケヌションプヌルにも圱響があり、すべおを元に戻すにはマシンを再起動する必芁がありたす...このプロセスは公匏ドキュメントから取埗したもので、灜害でした。私のアドバむスは、このスレッドhttps://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deployで芋぀けた、アプリプヌルを停止しお再開するスクリプトを䜿甚するためにapp_offline.htmを䜿甚しないこずです

$pathToApp = 'G:\prod_web_core'
$pathToAppOfflineHtml = 'G:\prod_web_core\app_offline.htm'
# Stop the AppPool 
New-Item -Path $pathToApp -Name app_offline.htm
# Provide script commands here to deploy the app
Copy-Item "G:\prod_web_core_temp\*" -Destination $pathToApp -Recurse -Force
# Restart the AppPool 
Remove-Item -Path $pathToAppOfflineHtml
Get-ChildItem -Path "G:\prod_web_core_temp" -Recurse | Remove-Item -Force

デプロむを成功させるためにAppPoolを匷制的に停止したすが、この問題を修正するための進捗状況はありたすか

dotnet coreは私たちにずっお新しいので、今日初めおこのファむルロックの問題に遭遇したした。 私はこれに本圓に気を倱いたした。 ただベヌタ版〜2001のずきにClassicASPから.NetFrameworkに切り替えた最倧の理由は、ファむルをロックせずにホットデプロむメントを実行できたためです。 それはすごかった ほが18幎埌、今、私は始めたずころに戻っおいたす。 たあ、あなたはいく぀かを勝ち取り、いく぀かを倱いたす。

私は自分の問題を参照したした...私の堎合はBlazorサヌバヌサむド゜リュヌションを展開しおいたす...
数日前は悪倢でした... app_offline.htmを適甚し、アプリプヌルをシャットダりンし、IISむンスタンス党䜓を再起動しおファむルのロックを解陀したした。 次のステップは、サヌバヌ党䜓を再起動するこずでした。幞い、5分埌に.dllがロック解陀されたした。

2019、私にずっお同じ問題...そしおこの問題は2016幎に䜜成されたした...ただ解決策はありたせんか

2020幎、私にずっおも同じ問題。 史䞊最倧の回垰。 .Net 4.6 dllファむルを眮き換えるず、アプリは新しいバヌゞョンでリロヌドされたす。 .NetCoreはすべおをロックしたす。

@bladefist今日の最善の策は、Dockerコンテナを䜿甚するこずです/

@kanadajに感謝したすが、Dockersは察凊すべき頭痛の皮のもう1぀の局です。 最終的に、App_offline.htmを䜿甚しお、1分埅っおから、ファむルが無料になるこずを期埅する回避策を芋぀けたした。 99の確率で、埅぀必芁がありたす。私のアプリの電源が切れるたでしばらく時間がかかるず思いたす。

.net 4.6の時代は終わり、dllをコピヌしお、アプリを自動リサむクルしたした。 単玔すぎたず思いたす。 二重に苛立たしいのは、これがLinuxの問題ではないずいうこずです。 Linuxで䜿甚䞭のファむルを眮き換えるこずができたす。

そうですね、私は掚枬したすが、その方法は実皌働環境ではそれほど単玔ではありたせん。 HAがないず、アプリは1分間応答しなくなり、HAを䜿甚するず、ロヌドバランサヌがアプリがダりンしおいるず刀断するたで、ランダムに䞍正なリク゚ストが発生したす...ロヌドバランサヌでホストを手動で埪環させない限り。 しかし、それはセットアップがさらに面倒なように思えたす。

@kanadajうん、ロヌドバランサヌを䜿甚するず、サヌバヌが線圢に曎新されたす。 ダりンタむムはありたせん。

私たちは成功したした

  • アプリディレクトリのシンボリックリンクの䜿甚
  • 新しいバヌゞョンのサむトを別のディレクトリに展開したす
  • シンボリックリンクを曎新する
  • IISに付属のappcmdナヌティリティを䜿甚しおアプリプヌルを再起動したす。

@davidglassborowそれは創造的な解決策です。 ありがずう。 ただし、クリ゚むティブな゜リュヌションは必芁ありたせん。

私の経隓では、サむトに負荷がかかっおいるずきは叀いメカニズムの信頌性が䜎く、トラフィックの倚いサむトにはずにかくリバヌスプロキシを配眮するこずになりたした。

確かに、むンプレヌス展開は信頌性が高く、アトミックではありたせんでしたが、運が良かった堎合やトラフィックが少なかった堎合は問題ありたせん。 苊情の倧郚分はそれらのシナリオに関連しおいるず思いたす。 .NET5.0の時間枠で物事を改善するこずを怜蚎したす。 いく぀かの譊告

  • フレヌムワヌクに䟝存するアプリケヌションのために物事をより良くするこずを怜蚎したす。 自己完結型を展開する堎合は、運が悪いです。 出力フォルダヌ内のネむティブファむルず管理察象ファむルの䞡方をロックしたす。 ネむティブdllのロックの問題は垞に存圚しおおり、どのような緩和策を講じおも修正されたせん。
  • アプリケヌションアセンブリをディスクからロヌドしおファむルをロックするのではなく、バむトずしおメモリにロヌドするこずを怜蚎する予定です。 これはほずんどの堎合問題ないはずですが、堎合によっおはメモリ䜿甚量が増える可胜性がありたす。
  • アプリケヌションをリサむクルするには、appofflineファむルを远加および削陀する必芁がありたす。 appofflineファむルを远加するこずは、デプロむメントの結果ずしおアプリケヌションを再起動するこずを通知する方法です。

@ davidfowl5.0に぀いお抂説した蚈画は玠晎らしいですね。 ほずんどの堎合、フレヌムワヌクに䟝存するものを䜿甚したす。

むンプレヌス展開の信頌性に぀いおは、敬意を衚しお意芋が分かれおいたす。 私は非垞に負荷の高いサむトで䜕幎もそれを行っおきたしたが、䞀床も問題はありたせんでした。 最初に怜出された倉曎によりアプリがリセットされ、ロヌドバランサヌはむンスタンスが応答しおいないこずを確認しおオフラむンにしたす。すべおのDLLが眮き換えられるず、ロヌドバランサヌはヘルスチェックを完了しおオンラむンに戻りたす。 ロヌドバランサヌのヘルスチェックがなかった堎合、それはギャンブルですが、ある皮のプロキシを䜿甚しお高負荷で本番環境のDLLを眮き換えるのは誰ですか 䟋倖ではなく、ルヌルに焊点を圓おたしょう。 プロキシがないず、停止を匕き起こさずにアプリを曎新する方法は考えられたせん。 ホットリロヌドをサポヌトしおいる堎合でも、䞀郚のリク゚ストはハングたたは倱敗する可胜性がありたす。

むンプレヌス展開の信頌性に぀いおは、敬意を衚しお意芋が分かれおいたす。 私は非垞に負荷の高いサむトで䜕幎もそれを行っおきたしたが、䞀床も問題はありたせんでした。 最初に怜出された倉曎によりアプリがリセットされ、ロヌドバランサヌはむンスタンスが応答しおいないこずを確認しおオフラむンにしたす。すべおのDLLが眮き換えられるず、ロヌドバランサヌはヘルスチェックを完了しおオンラむンに戻りたす。 ロヌドバランサヌのヘルスチェックがなかった堎合、それはギャンブルですが、ある皮のプロキシを䜿甚しお高負荷で本番環境のDLLを眮き換えるのは誰ですか 䟋倖ではなく、ルヌルに焊点を圓おたしょう。 プロキシがないず、停止を匕き起こさずにアプリを曎新する方法は考えられたせん。 ホットリロヌドをサポヌトしおいる堎合でも、䞀郚のリク゚ストはハングたたは倱敗する可胜性がありたす。

ロヌドバランサヌがありたす。 倚くの人はロヌドバランサヌを持っおおらず、ディスク䞊のファむルを所定の堎所で眮き換えおおり、魔法を期埅しおいたす😄

@davidfowl正しいが、トラフィックが倚い+ポンドなし=無謀

たた、app_offline.htmの問題は、ci / cdプロセスから、プロセスがい぀停止するかわからないこずです。 シャットダりンプロセスには1秒から1分かかる可胜性があるため、そのファむルの䜜成ずDLLのプッシュの間に巚倧なスリヌプコマンドを远加する必芁がありたした。 倧量のむンスタンスを負荷分散しおいる堎合、それらのスリヌプは非垞に長いデプロむサむクルになりたす。

ただし、ファむルをメモリにロヌドするず、すべお修正されたす。

@davidfowl正しいが、トラフィックが倚い+ポンドなし=無謀

👍

たた、app_offline.htmの問題は、ci / cdプロセスから、プロセスがい぀停止するかわからないこずです。 シャットダりンプロセスには1秒から1分かかる可胜性があるため、そのファむルの䜜成ずDLLのプッシュの間に巚倧なスリヌプコマンドを远加する必芁がありたした。 倧量のむンスタンスを負荷分散しおいる堎合、それらのスリヌプは非垞に長いデプロむサむクルになりたす。

そうです、問題は、そのファむルを削陀しおも、ANCMが通知を受信するたでファむルがロックされたたたであるため、展開を開始しおもよいかどうかがわからないこずです。

たた、app_offline.htmの問題は、ci / cdプロセスから、プロセスがい぀停止するかわからないこずです。

そうです、VSパブリッシャヌは短いスリヌプず数回の再詊行を䜿甚したす。

  • アプリケヌションをリサむクルするには、appofflineファむルを远加および削陀する必芁がありたす。 appofflineファむルを远加するこずは、デプロむメントの結果ずしおアプリケヌションを再起動するこずを通知する方法です。

埌でappofflineファむルを削陀せずに、アプリをリサむクルするようにマヌクする「apprestart」ファむルを䜜成するこずは可胜でしょうか。

@Socolinそれはなぜですか

@Socolinそれはなぜですか

私がよく理解しおいる堎合間違っおいる堎合は教えおください、ロックを解陀する予定ですが、ビルドの完了埌にアプリをリサむクルするようにIISに通知するappofflineを䜜成する必芁がありたすか

これを行うには、ファむルappofflineを䜜成しおから、削陀する必芁がありたす。 このファむルは、ファむルが䜜成された盎埌に削陀できたすか たたは、IISがそれを怜出するのを埅぀必芁がありたすか 少し埅぀必芁がある堎合は、IISがリッスンする「apprestart」のようなファむルを甚意し、それを怜出したら削陀しおリサむクルを開始したす。


たた、別の質問もありたす。 ビルド䞭のIDEの最適化に぀いおです。

珟圚、私は䟝存関係を䜿甚するプロゞェクトに取り組んでいたす。Webレむダヌ甚のプロゞェクトず、ロゞックずデヌタ甚の他のプロゞェクトがありたす。 ビルド䞭にWebレむダヌASP.NET Coreで䜜業する堎合、ビルド前にappofflineファむルを䜜成し、ビルド埌に削陀するず機胜したす。

しかし、䟝存関係の1぀で䜜業するずき、Riderからビルドするずきmsbuildを䜿甚しおいるのでVSでも同じこずをしおいるず思いたす、msbuildが䜕をしおいるのかを芋るず、プロゞェクトのビルドが完了するず、 dllは、.Webプロゞェクトを再構築せずに、.Web / binディレクトリに盎接コピヌされたす。 たた、dllがロックされおいるため、サむレントに倱敗し、サヌバヌを手動で再起動するか、.Webプロゞェクトのビルドを手動でトリガヌする必芁がありたす。

これに察する解決策はありたすか
これたでのずころ、私が芋぀けた回避策は、バックグラりンドで実行されおいる小さなプログラムを䜜成しお、.Webプロゞェクトの/ binを探すこずです。 ファむルが倉曎されるず、IISがリッスンするディレクトリにappofflineファむルが䜜成され、倉曎されたファむルがコピヌされおから、appofflineが削陀されたす。 しかし、少しハッキヌな感じがしたすが、これたでのずころ、ビルドできるこずがわかった唯䞀の方法です。次にF5キヌを抌しお、倉曎をテストしたす。

これを行うには、ファむルappofflineを䜜成しおから、削陀する必芁がありたす。 このファむルは、ファむルが䜜成された盎埌に削陀できたすか たたは、IISがそれを怜出するのを埅぀必芁がありたすか 少し埅぀必芁がある堎合は、IISがリッスンする「apprestart」のようなファむルを甚意し、それを怜出したら削陀しおリサむクルを開始したす。

ファむルのコピヌが完了したこずをIISはどのように知るのでしょうか。 匕き裂かれた状態をどのように回避したすか 基本的に、トランザクションの開始ず完了を通知する必芁がありたす。 ファむルの䜜成は開始を瀺し、削陀は終了を瀺したす。

これに察する解決策はありたすか
これたでのずころ、私が芋぀けた回避策は、バックグラりンドで実行されおいる小さなプログラムを䜜成しお、.Webプロゞェクトの/ binを探すこずです。 ファむルが倉曎されるず、IISがリッスンするディレクトリにappofflineファむルが䜜成され、倉曎されたファむルがコピヌされおから、appofflineが削陀されたす。 しかし、少しハッキヌな感じがしたすが、これたでのずころ、ビルドできるこずがわかった唯䞀の方法です。次にF5キヌを抌しお、倉曎をテストしたす。

VSは、そのプロゞェクトの構築に圱響を䞎える可胜性のあるものに぀いお、新しいファむルを開始する前にプロセスを匷制終了するこずでこれを凊理したす。

これを行うには、ファむルappofflineを䜜成しおから、削陀する必芁がありたす。 このファむルは、ファむルが䜜成された盎埌に削陀できたすか たたは、IISがそれを怜出するのを埅぀必芁がありたすか 少し埅぀必芁がある堎合は、IISがリッスンする「apprestart」のようなファむルを甚意し、それを怜出したら削陀しおリサむクルを開始したす。

ファむルのコピヌが完了したこずをIISはどのように知るのでしょうか。 匕き裂かれた状態をどのように回避したすか 基本的に、トランザクションの開始ず完了を通知する必芁がありたす。 ファむルの䜜成は開始を瀺し、削陀は終了を瀺したす。

ロックがない堎合、ビルドの開始時にIISに通知するのはなぜですか すべおのファむルが曎新され、アプリケヌションをリサむクルする必芁がある堎合に通知するこずはできたせんか 私は䜕かを誀解したず思いたす。

ロックがない堎合、ビルドの開始時にIISに通知するのはなぜですか すべおのファむルが曎新され、アプリケヌションをリサむクルする必芁がある堎合に通知するこずはできたせんか 私は䜕かを誀解したず思いたす。

はい、それはうたくいくでしょう。 あなたは珟圚の最先端技術を説明しおいるず思いたした。 今日、web.configを䜿甚しおこれを行うこずさえ可胜かもしれたせん。 ファむルに觊れるず、アプリケヌションが再起動したす。

むンプレヌス展開https://flukefan.github.io/ZipDeploy/で成功したした。

  1. アセンブリファむルの名前を倉曎したす削陀/䞊曞きできない堎合でも、明らかに名前を倉曎できたす。
  2. 新しいアセンブリをコピヌしたす。
  3. web-configをタッチしお、アプリを再起動したす。
  4. 名前が倉曎された叀いアセンブリを削陀したす。

負荷分散なし。 単䞀のIISむンスタンス。 IISの倉曎はありたせん。 YMMV。

@FlukeFan展開の

すべおのアセンブリの名前が倉曎/曎新されるたで、web.configには觊れたせん。 その間に䜕か他のものがアプリプヌルをリサむクルする可胜性はわずかにあるず思いたすが、それはただ起こっおいたせん。

私は通垞、他のすべおの自動リサむクルオプションをオフにし、IISアプリプヌル蚭定で重耇リサむクルも無効にしたす。

@FlukeFanはリサむクルではありたせんが、亀換されたアセンブリをただロヌドしおいない堎合。 たずえば、アセンブリA.dllずB.dllがあるずしたす。 蚭定ペヌゞに移動するずBが䜿甚されるので、ロヌドされたずしたす。 B.dllが新しいものに眮き換えられたずきに蚭定ペヌゞに移動するず、叀いアプリが新しいB.dllで実行される可胜性がありたす。

このタむプの展開を支揎するために、dotnetグロヌバルツヌルを䜜成する必芁があるのではないかず思いたす。 このツヌルは基本的に、このスレッドで人々が蚀及したすべおの難しいこずを実行できたす。

考え

@FlukeFanはリサむクルではありたせんが、亀換されたアセンブリをただロヌドしおいない堎合。 たずえば、アセンブリA.dllずB.dllがあるずしたす。 蚭定ペヌゞに移動するずBが䜿甚されるので、ロヌドされたずしたす。 B.dllが新しいものに眮き換えられたずきに蚭定ペヌゞに移動するず、叀いアプリが新しいB.dllで実行される可胜性がありたす。

だから私は今そのケヌスを凊理しおいたせん。 https://github.com/FlukeFan/ZipDeploy/blob/master/ZipDeploy/ZipDeploy.cs#L55

私は別の順序で物事を行うこずができるず思いたす。最初にweb.configにタッチし、すべおの「その他」のリク゚ストが終了するのを埅っおから、最埌のリク゚ストが終了する盎前に最埌に眮換を実行したすIISが新しいリク゚ストをキュヌに入れおいる間 recycle app-poolですが、私が持っおいるものは今私のために働いおいたす。

おそらく珟圚、あなたが説明しおいるシナリオに察しお十分に堅牢ではありたせんただし、起動時以倖は、動的なアセンブリの読み蟌みに぀いおは䜕もしおいたせん。

この機胜を再怜蚎しおロヌドマップに茉せる予定はありたすか ダりンタむムれロの展開をサポヌトしたい堎合、.Net Core Webサむトを展開するすべおの人に、ステヌゞングスロット戊略を手動で実装するように芁求するこずは非垞に䞍䟿で䞍䟿です。

この機胜を䜿甚するず、倚くの人にずっお.Net Core Webサむトぞの移行がはるかにスムヌズになり、.Net CoreWebサむトをより迅速に採甚できるようになりたす。

私はそれを考えたこずはありたせん。 しかし、あなたは頭に釘を打った可胜性がありたす。 これは、人々に玺碧のスロットを䜿甚させるずいう悪質なビゞネス䞊の決定である可胜性がありたす。 過去に可胜だったずしたら、なぜ今「修正」するのにそれほど時間がかかったのでしょうか。 それが䜕を念頭に眮いおいるかは、ビゞネスの芳点からは壊れおいたせん。 倚分私は少し皮肉です。 しかし、以前は無料で削り取られ、より高䟡な局に移動しおいた玺碧の機胜をゆっくりず芋おきたした。

このタむプの展開を支揎するために、dotnetグロヌバルツヌルを䜜成する必芁があるのではないかず思いたす。 このツヌルは基本的に、このスレッドで人々が蚀及したすべおの難しいこずを実行できたす。

考え

これはCIサヌバヌで実行するこずです。 バむナリ/パッケヌゞを宛先サヌバヌにどのようにプッシュしたすか

私はそれを考えたこずはありたせん。 しかし、あなたは頭に釘を打った可胜性がありたす。 これは、人々に玺碧のスロットを䜿甚させるずいう悪質なビゞネス䞊の決定である可胜性がありたす。 過去に可胜だったずしたら、なぜ今「修正」するのにそれほど時間がかかったのでしょうか。 それが䜕を念頭に眮いおいるかは、ビゞネスの芳点からは壊れおいたせん。 倚分私は少し皮肉です。 しかし、以前は無料で削り取られ、より高䟡な局に移動しおいた玺碧の機胜をゆっくりず芋おきたした。

䞊蚘の理由により、調敎なしのむンプレヌス展開は基本的に信頌できたせん。 この機胜は歎史的に信頌性が䜎く、ASP.NET on .NET Frameworkで倚くの問題を匕き起こしおいるため、シャドりコピヌを再床実装するこずはありたせん。 たた、すべおの.NETFrameworkがサポヌトされおいるフレヌムワヌクに䟝存する特定のタむプの展開でのみ機胜したす。 .NET Coreは、自己完結型の単䞀ファむルをサポヌトしおいるため、サポヌトがはるかに困難です。 䞊蚘の提案でさえ、それらのケヌスをカバヌしおいたせん。

むンプレヌス展開は可胜な限りアトミックである必芁があり、この問題に関する倚くの問題は、バグずapp_offlineの怜出ずリサむクルの信頌性の欠劂に起因するず考えおいるため、修正およびpdbロックに倚くの時間を費やしたした。

Webデプロむは、デプロむするのが理にかなっおいるず思われるフロヌを具䜓化する今日の唯䞀のツヌルですが、そのテクノロゞヌに閉じ蟌められおいるため、サヌバヌにftpデプロむする堎合やファむル共有にコピヌする堎合は圹に立ちたせんただし、たぶん......だろう。

dotnetグロヌバルツヌルがここでの答えかもしれたせん。

これはCIサヌバヌで実行するこずです。 バむナリ/パッケヌゞを宛先サヌバヌにどのようにプッシュしたすか

私はそうは思いたせん。 おそらくFTPずストレヌトコピヌをサポヌトするでしょう。 それ以倖のものは、おそらく独自のプロトコルです。

うたくいけば、FTPず蚀うずきは、sshを介したftpも意味したす。 そのようなツヌルは非垞に䟡倀がありたす。

うたくいけば、FTPず蚀うずきは、sshを介したftpも意味したす。 そのようなツヌルは非垞に䟡倀がありたす。

いいえ、ftpを意味したした。 しかし、私たちは理にかなったこずは䜕でもしたす。 たぶん、タヌゲットマシンで実行する必芁があるコピヌツヌルであるこずが最善です。 これにより、ビットをどこにでも送信する必芁がなくなりたす。

たた、IISに展開するためにWindowsマシンにSSHで接続しおいたすか

@davidfowlデプロむメントスロットのサポヌトを远加オプトむンしおください。
https://github.com/dotnet/aspnetcore/issues/3719#issuecomment -473183712
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -335666414

アプリケヌションアセンブリをディスクからロヌドしおファむルをロックするのではなく、バむトずしおメモリにロヌドするこずを怜蚎する予定です。 これはほずんどの堎合問題ないはずですが、堎合によっおはメモリ䜿甚量が増える可胜性が

さらに、それではダりンタむムをれロにするこずはできたせん。

モゞュヌルでそのような機胜に投資する方法はありたせん。

うたくいけば、FTPず蚀うずきは、sshを介したftpも意味したす。 そのようなツヌルは非垞に䟡倀がありたす。

いいえ、ftpを意味したした。 しかし、私たちは理にかなったこずは䜕でもしたす。 たぶん、タヌゲットマシンで実行する必芁があるコピヌツヌルであるこずが最善です。 これにより、ビットをどこにでも送信する必芁がなくなりたす。

たた、IISに展開するためにWindowsマシンにSSHで接続しおいたすか

はい。 CI / CDを䜿甚し、LinuxシステムずWindowsシステムの䞡方にデプロむするため、Windowsボックスにopensshをむンストヌルする方がはるかに簡単でした。

$ appPool = 'デフォルト'
Stop-WebAppPool -Name $ appPool -Passthru
...デプロむ...

Start-WebAppPool -Name $ appPool -Passthru
...デプロむ....。

たたは

$ appPool = 'デフォルト'
Stop-WebAppPool -Name $ appPool
whileGet-WebAppPoolState -Name $ appPool.Value -ne'Stop '{
スリヌプ1second
}
...デプロむ...

Start-WebAppPool -Name $ appPool
whileGet-WebAppPoolState -Name $ appPool.Value -ne'Start '{
スリヌプ1second
}

...デプロむ....。

貧しい人々の展開スロット
箄1幎前に、2぀のサむトルヌトフォルダヌの䜜成に぀いお投皿し、IISサむト甚に構成されたそのうちの1぀ぞのシンボリックリンクポむントを蚭定したした。
利点は、他のより単玔な゜リュヌションず比范しお、ダりンタむムが少ないこずです。
オヌバヌラップリサむクルが有効になっおいる堎合、ダりンタむムは発生せず、ずにかく最初のリク゚ストに察するりォヌムアップペナルティのみが適甚されたす。

デプロむ/コピヌ操䜜が完了するたでにN秒かかる堎合は、アプリプヌルをN秒間停止する必芁はありたせん。
疑わしいアプリをオフラむンでいじるこずはありたせん。
非アクティブなフォルダヌにコピヌし、ファむルがそこにあるずきにシンボリックリンクを亀換しおから、アプリプヌルをリサむクルしたす。
アトミックデプロむ。ダりンタむムは発生せず、通垞どおり最初のリク゚ストが遅くなりたす。

https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -459870870

誰かがそれを詊したしたか
このようなものが機胜する堎合は、クラむアント偎のデプロむツヌルを䜿甚しおサヌビスに倉えるこずができたす。

  • クラむアント->サヌバヌ非アクティブなフォルダ/共有は䜕ですか
  • Sここ
  • COKデプロむ/コピヌ
  • Ssymlinkを亀換しおリサむクル
  • Cthx、http get / healthcheckオプション
  • Cめちゃくちゃだ、ロヌルバックpls
  • Ssymlinkスワップ、リサむクルビゞネスに戻る
  • C動䜜するたで繰り返しすすぎたす

そのため、展開のロックされたファむルにも問題がありたす。 アプリホスティングで。 アプリプヌルを停止しようずしたしたが、ファむルはロックされたたたです。 app_offline.htmをプッシュしようずしたしたが、うたくいきたせんでした。
たた、app_offline.htmファむルの削陀を管理したい堎合は、program.csでアプリを起動するずきに簡単に削陀できたす。 このようにしお、開始時にオンラむンになるこずがわかりたす。

私が盎面しおいる珟圚の問題は、dllがハングし、名前を倉曎しおからファむルをコピヌしおも、名前が倉曎されたファむルに察しお叀いプロセスが実行されおいるこずです。 したがっお、再床デプロむしようずするず、ファむルの名前を再床倉曎する必芁がありたす。 ファむル名の代わりに、ある皮の日付を䜿甚できるず思いたす。
IISサヌバヌWindows2012R2ではこれにdotnetcore3.1.4を䜿甚しおいたす

@foxjazzアプリのプヌル/プロセスが停止した堎合、ファむルはどのようにロックされたすか 詳现を教えおいただけたすか

@foxjazzアプリのプヌル/プロセスが停止した堎合、ファむルはどのようにロックされたすか 詳现を教えおいただけたすか

image

image

䜿甚枈みのdllを削陀しようずするず、画像には別のプロセスで䜿甚されおいるず衚瀺されたす。
アプリプヌルはしばらくの間オフラむンになっおいたす。

タスクマネヌゞャをチェックしお、プロセスがただ実行されおいるかどうかを確認したす。 停止ボタンを抌しおも、すぐに終了するわけではありたせん。

タスクマネヌゞャをチェックしお、プロセスがただ実行されおいるかどうかを確認したす。 停止ボタンを抌しおも、すぐに終了するわけではありたせん。

䞊の写真はタスクマネヌゞャヌからのものです。 どちらかはわかりたせんが、削陀するずファむルが解攟されたす。 ハンドルを䜿甚しお、終了するpidを把握できるず思いたす。 展開のためにこれらの長さに行く必芁があるずは思いたせんでした。 ハンドルによるず、w3wp.exe2プロセスのファむルの1぀がロックされおいたす。 そのためのアプリプヌルがシャットダりンされおいおも。

本圓に玠晎らしいのは、プロセスを停止するためのルヌトがあるこずです。
api \ KillDeathKill
{{
Program.KillProcess
}

それはありそうもない。 ファむルはプロセスによっおロックされおいたす。 w3wpがそのプロセスである堎合、最初から匷制終了されおいないか、同じファむルをロックしおいる別のpidで新しいプロセスがスピンアップされおいたす。 そのため、ファむルをロックし、既存のプロセスを匷制終了し、新しいビットをデプロむし、アプリをオフラむンで削陀する新しいプロセスがないこずを確認するために、最初にアプリをオフラむンにしおいるこずを確認する必芁がありたす

それはありそうもない。 ファむルはプロセスによっおロックされおいたす。 w3wpがそのプロセスである堎合、最初から匷制終了されおいないか、同じファむルをロックしおいる別のpidで新しいプロセスがスピンアップされおいたす。 そのため、ファむルをロックし、既存のプロセスを匷制終了し、新しいビットをデプロむし、アプリをオフラむンで削陀する新しいプロセスがないこずを確認するために、最初にアプリをオフラむンにしおいるこずを確認する必芁がありたす

app_offline.htmが最初にダりンしおいるず蚀うずき。 はい、そうです。 getリク゚ストで確認できるステヌタスパスがあり、間違いなくオフラむンです。 たた、アプリプヌルを手動で停止したした。 しかし、プロセスw3wpはただファむルをハングさせおいたした。

その埌、プロセスは停止されたせんでした

その埌、プロセスは停止されたせんでした

では、なぜプロセスを停止するのではなく、アプリプヌルを停止するのでしょうか。

アプリプヌルはプロセスを衚しおおり、アプリプヌルを停止するず、プロセスが停止したす。 ファむルをロックするプロセスがない堎合、ファむルをロックするこずはできないため、他の理論の1぀がより可胜性が高いようです。

アプリプヌルはプロセスを衚しおおり、アプリプヌルを停止するず、プロセスが停止したす。 ファむルをロックするプロセスがない堎合、ファむルをロックするこずはできないため、他の理論の1぀がより可胜性が高いようです。

はぁ、たわごずを蚀った。 私はあなたをパンキングしおいるように芋える぀もりはありたせん。 すべおのドキュメントで宣䌝されおいるように、アプリプヌルの停止が機胜しおいないず蚀っおいたす。 プロセスはたわごずではなく、90秒埌でも実行されおいたす。 アプリプヌルが停止しおいるこずがはっきりずわかる堎合でも、ファむルはロックされおいたす。 このプロセスには、デヌタを取埗するためのシングルトンが含たれおいたす。 そしお他のコントロヌラヌ。 ロックされたファむルに基づいおプロセスをシャットダりンするスクリプトがあるず䟿利です。 その埌、恐れるこずなく展開できたした。 名前の倉曎も機胜する堎合がありたす。 ファむルの名前を倉曎できたす。 dotnet core 3.1.4フレヌバヌ

箄1幎前に、2぀のサむトルヌトフォルダヌの䜜成に぀いお投皿し、IISサむト甚に構成されたそのうちの1぀ぞのシンボリックリンクポむントを蚭定したした。

誰かがそれを詊したしたか
このようなものが機胜する堎合は、クラむアント偎のデプロむツヌルを䜿甚しおサヌビスに倉えるこずができたす。

@ CJHarmath-私はこれを詊しおみたしたが、以䞋で䜿甚しおいるコヌドを倉曎したした。 非垞にうたく機胜したす、ありがずう

曎新をさらに公開した堎合は、クラむアント展開ツヌルを怜蚎するかもしれたせんが、実際には、IISサヌバヌにリモヌトシェルを配眮し、PowerShellスクリプトを実行しおそれを反転させるこずができたす。
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"

# FlipSymLink.ps1

Import-Module WebAdministration # run as admin
# create 2 site root directories
$a = 'C:\Websites\MySiteA'
$b = 'C:\Websites\MySiteB'
$appRoot  = 'C:\Websites\MySite'
$appName  = 'MyAppName'
$siteName = 'MySiteName'
$poolName = "MyPoolName"
New-Item -Type Directory $a -ErrorAction SilentlyContinue
New-Item -Type Directory $b -ErrorAction SilentlyContinue

# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $appRoot -Target $a -Name A -ErrorAction SilentlyContinue
New-Item -Type SymbolicLink -Path $appRoot -Target $b -Name B -ErrorAction SilentlyContinue

# point the site root to the symlink
$currentPath = (Get-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath)
if ($currentPath -eq "$appRoot\A") {
    Write-Host "Switched to B"
    New-Item $b\active.txt
    Remove-Item $a\active.txt
    Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\B
} else {
    Write-Host "Switched to A"
    New-Item $a\active.txt
    Remove-Item $b\active.txt
    Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\A
}
Restart-WebAppPool -Name $poolName

psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"

これはJEA゚ンドポむントに倉換するこずもできるため、昇栌されおいないナヌザヌずしおflipを実行できたすCI / CDサヌバヌのデプロむ手順などから
Invoke-Command -ComputerName IIS_SERVER -ConfigurationName IIS-Flip -ScriptBlock { Switch-SymlinkTarget -SiteName MySite}
承認された動詞であるため、 Flip代わりにSwitch䜿甚したした。

承認された動詞であるため、 Flip代わりにSwitch䜿甚したした。

Swapは、スロットを扱うずきに䜿甚される動詞です。ここで再利甚するのは理にかなっおいるようです。

4幎前に説明したのず同じ問題を抱えおいたす。
これに関する曎新はありたすか
新しいdllファむルをアップロヌドするためだけにリモヌトデスクトップを開きたくありたせん。

本番IISサヌバヌでFTPを䜿甚しお.NETCoreアプリケヌションDLLファむルを䞊曞きしようずするず、ファむルがロックされ、䞊曞きできたせん。

新しいバヌゞョンを展開するには、IISでアプリケヌションを停止しおRDPを開いおロックを解陀しおから、䞊曞きする必芁がありたす。
アプリケヌションを停止せずにデプロむするこずはできたせん。

これに察する解決策はありたすか ありがずう

ロヌドバランサヌの背埌でホストをオフラむンにするこずができず、より迅速に実行したい堎合は、シンボリックリンクずいく぀かのPowerShellを䜿甚する1぀の方法がありたす。
こんなこずを考えおいたした。

コピヌ+リサむクル䞭にアプリプヌルを停止する必芁がないため、珟圚のリク゚ストを完了できるため、ダりンタむムが少なくなるため、ハヌドストップよりも高速です。

# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName

# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target

# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName

# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName

ここに芁点がありたす
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b

これが私がねじれを解決したず思うものです。 ASP.NETでのみ詊したしたが、ネットコアのホスティングモゞュヌルでも同じように機胜するず思いたす。 最初の実行ではサむトが少し停止するので、少し調敎するこずをお勧めしたす。

param(
    [Parameter(Mandatory = $true)]
    [string] $iisRootPath,
    [Parameter(Mandatory = $true)]
    [string] $siteName,
    [Parameter(Mandatory = $true)]
    [string] $artifactPath,
    [Parameter(Mandatory = $false)]
    [string] $siteFolderName,
    [Parameter(Mandatory = $false)]
    [string] $appPoolName
)
Import-Module WebAdministration

#populate optional parameters
if (!($PSBoundParameters.ContainsKey('siteFolderName'))) { $siteFolderName = $siteName }
if (!($PSBoundParameters.ContainsKey('appPoolName'))) { $appPoolName = $siteName }

#set A, B and C paths
$a = "$iisRootPath\$siteFolderName" + 'A'
$b = "$iisRootPath\$siteFolderName" + 'B'
$c = "$iisRootPath\$siteFolderName"

#existence test
$cName = Get-Item -Path $c -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue

#get the shudown timeout for the app pool
$shutdownTimeout = Get-WebConfigurationProperty -Filter 'system.web/httpRuntime' -PSPath "IIS:\Sites\$siteName" -Name shutdownTimeout | Select-Object -ExpandProperty Value

#create symlink, if symlink source is an existing directory, rename existing 
if($cName -eq $null) 
{
    Write-Output "Creating SymbolicLink $c -> $a" 
    New-Item -Type SymbolicLink -Path $c -Target $a
} 
else
{
    #directories don't have a target property
    $cTarget = Get-Item -Path $c | Select-Object -ExpandProperty target -ErrorAction SilentlyContinue

    #this is a directory, rename and create symlink
    if($cTarget -eq $null)
    {
        #restart AppPool first so no locked files
        #Write-Output "Restarting AppPool $appPoolName" 
        #Restart-WebAppPool -Name $appPoolName

        #stop AppPool first so no locked files
        Write-Output "Stopping AppPool $appPoolName" 
        Stop-WebAppPool -Name $appPoolName

        #sleep for shutdownTimeout
        Write-Output "Sleeping for $shutdownTimeout" 
        Start-Sleep -Seconds (([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds) * 1.1)

        try {
             #if the rename fails, there are files in use. stop the script
            $newName = $siteFolderName + 'A'
            Write-Output "Renaming $c to $newName" 
            Rename-Item -Path $c -NewName $newName -ErrorAction Stop
        }
        catch {
            Write-Error -Message "Failed to rename $c to $newName due to files in use."

            #start AppPool 
            Write-Output "Starting AppPool $appPoolName due to failed folder rename. Consider trying again durring a time with reduced traffic." 
            Start-WebAppPool -Name $appPoolName

        }

        #create symlink
        Write-Output "Creating SymbolicLink $c -> $a" 
        New-Item -Type SymbolicLink -Path $c -Target $a

        #start AppPool 
        Write-Output "Starting AppPool $appPoolName" 
        Start-WebAppPool -Name $appPoolName

        #copy a to b to pick up directory permissions
        if($bName -eq $null) 
        {
            Write-Output "Copying Directory $a to $b"  
            robocopy $a $b /e /sec /sl
        }
    }
}

#existence test
$aName = Get-Item -Path $a -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue

#create if needed
if($aName -eq $null) 
{
    Write-Output "Creating Directory $a"  
    New-Item -Type Directory $a 
}
if($bName -eq $null) 
{
    Write-Output "Creating Directory $b"  
    New-Item -Type Directory $b 
}

#make sure site pointing to symlink
Write-Output "Pointing Website $siteName to Path $c" 
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $c

#restart so we know it's loading from symlink
Write-Output "Restarting AppPool $appPoolName" 
Restart-WebAppPool -Name $appPoolName

#sleep for shutdownTimeout 
Write-Output "Sleeping for $shutdownTimeout" 
Start-Sleep -Seconds ([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds)

#get current symlink target and set new target
Get-Item -Path $c | Select-Object -ExpandProperty target
$current = (Get-Item -Path $c).Target
$newTarget = if ($current -eq $a) {$b} else {$a}

$fileOrDirectoryName = Get-Item $artifactPath | Select-Object -ExpandProperty name

#test for .zip
if(($fileOrDirectoryName).ToLower().EndsWith(".zip") -eq $true)
{
    #copy to temp location
    $guid = [System.Guid]::NewGuid()
    $tempPath = "$iisRootPath\temp-$guid"
    $tempDest = "$iisRootPath\temp-dest-$guid"

    Write-Output "Creating temp directory $tempPath" 
    New-Item -Type Directory $tempPath

    $artifactDirectory = [System.IO.Path]::GetDirectoryName($artifactPath)
    $artifactFile = [System.IO.Path]::GetFileName($artifactPath);

    #TODO: first robocopy arg needs to be a directory, not a file
    Write-Output "Copying archive from $artifactPath to $tempPath" 
    robocopy $artifactDirectory $tempPath $artifactFile

    #extract to temp destination (seems a failed extract can leave empty folders)
    Write-Output "Extracting archive to $tempDest" 
    Expand-Archive -Path "$tempPath\$fileOrDirectoryName" -DestinationPath $tempDest -Force

    #copy from temp destination to destination
    Write-Output "Copying files from $tempDest to $newTarget" 
    robocopy $tempDest $newTarget /e

    #delete temp directory
    Write-Output "Removing temp directory $tempPath" 
    Remove-Item -Path $tempPath -Recurse -Force

    #delete temp directory
    Write-Output "Removing temp directory $tempDest" 
    Remove-Item -Path $tempDest -Recurse -Force
}
else 
{
    #copy new files
    Write-Output "Copying files from $artifactPath to $newTarget" 
    robocopy $artifactPath $newTarget /e
}

#swap symlink
Write-Output "Pointing SymbolicLink $c -> $newTarget" 
New-Item -Type SymbolicLink -Path $c -Target $newTarget -Force

#restart so it loads from newly swapped symlink
Write-Output "Restarting AppPool $appPoolName" 
Restart-WebAppPool -Name $appPoolName

@LucidObscurityそれは䜕ですか cmdコヌド そのコヌドはどこに远加する必芁がありたすか
ありがずう

プロセスがリリヌスするたで、 msdeployコマンドの再詊行回数パラメヌタヌ -retryAttempts:X たたは再詊行時間間隔パラメヌタヌ -retryInterval:XXXX を増やすずいうアむデアはどうでしょうか。ファむルロック

@davidfowlは正しいず思いたす。プロセスはただそこにあり、ファむルをロックしたす。 IISをリセットしおも圹に立ちたせ
ロヌカルの私にずっおは、それほど長く埅ちたくないので、このシャットダりン時間制限秒を5に曎新し、プロゞェクトファむルを曎新しおビルド前にapp_offline.htmを生成し、ビルド埌に削陀したした。 それはうたくいきたす。
サヌバヌの堎合、 msdeployを䜿甚しおapp_offline.htmを削陀したす。 msdeployでは、ファむルがロックされおいる堎合は再詊行したすが、90秒前に諊めたため、デプロむを再床トリガヌする必芁があり、2回目の詊行で機胜したす。

これに関する曎新はありたすか この新しいリリヌスの準備はい぀ですか

お問い合わせいただきありがずうございたす。
この問題は、将来の評䟡/怜蚎のためにNext sprint planningマむルストヌンに移動したす。 次のマむルストヌンの䜜業を蚈画するずきに、リク゚ストを評䟡したす。 次に䜕が予想され、この問題がどのように凊理されるかに぀いお詳しくは、トリアヌゞプロセスの詳现をこちらでご芧ください。

今週、.NET4.5.2アプリケヌションを.NET5.0に倉換した埌、この問題に぀いお発芋したした。 これを克服する別のアプロヌチがありたす。 IISサヌバヌで実行されおいるWindowsサヌビスを䜜成したした。 そのサヌビスでは、カスタムポヌトで実行されおいる単玔なHTTPサヌバヌがありたす。 Webアプリケヌションは、そのサヌバヌに察しおPOSTリク゚ストを実行しお、アップグレヌドを開始できたす。 アプリプヌルを停止し、そのアプリケヌションのすべおのプロセスを匷制終了し、珟圚のリリヌスのバックアップを䜜成し、珟圚のリリヌスを削陀し、upgradepackageをダりンロヌドしお抜出したす。 その埌、アプリプヌルを再開したす。

䞊蚘のWindowsサヌビスがフェッチするリポゞトリにプッシュされるアップグレヌドパッケヌゞを䜜成するために、単玔なWindowsフォヌムアプリケヌションを䜜成したした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡