web-dev-qa-db-ja.com

IISワーカープロセスがファイルをロックしているのはなぜですか?

私のウェブサイトはD:\RW_System\RW_Webroot\BrokerOffice.Adminフォルダに設定されています(下のスクリーンショット)。 .NET、C#WebFormsアプリケーションです。

何らかの理由で、変更をサイトに展開したい場合は、ファイルをコピーしようとしますが、IISは、サイトがセットアップされているパスのDLLをロックします。

C:\Users\rizzo\Desktop>handle64 hiqpdf

Nthandle v4.11 - Handle viewer
Copyright (C) 1997-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

w3wp.exe  pid: 3700   type: File  2954: D:\RW_System\RW_Webroot\BrokerOffice.Admin\bin\HiQPdf.dll

ロックされているのは.dllだけではありません-\binフォルダ内のすべてのDLLです。私の理解は、IISがC:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\の下のフォルダにすべてをコピーし、そこから物事を実行したことでした。

複数のDLL=参照があるボックスに他のサイトがいくつかあり、予想どおり、w3wp.exeはそれらをTemporary ASP.NET Filesフォルダにロックしています。

IISまたはIISが原因で/ binフォルダー内のDLLがロックされる原因となっているコードに何か設定がありますか?

enter image description here

6
AngryHacker

誰かがこの問題に遭遇した場合に備えて、私の質問に答えます。 web.configファイルには<hostingEnvironment shadowCopyBinAssemblies="false" />ディレクティブ。存在さえ知らなかった。

この設定は、IISで、Temporary ASP.NET Filesフォルダ。

9
AngryHacker

サイトを展開する準備を整えるための迅速で信頼性の高い方法は、App_Offline.htm(~/App_Offline.htm)と呼ばれるファイルをWebサイトのルートフォルダーに作成することです。 App_Offline.htmが削除されるまで、コンテンツが存在する場合、コンテンツはすべてのリクエストに対して提供されます。このメソッドは、shadowCopyBinAssembliesに使用される値を含め、ほとんどすべてのケースで機能します。

基本的に、App_OfflineはIISの機能であり、Web配置で正しく配置できるようにするために使用されます-ロックの問題などを回避します。IISでは非常に低いレベルで動作しているようです。文字通りファイルです。アプリプールを強制終了するシステムウォッチャー。つまり、このテキストファイルを自分で簡単に作成して削除し、アプリを停止して再起動(または少なくとも再度有効にする)するためのWeb展開を行う必要はありません。

MS docsから取得:

ASP.Netは、「App_Offline.htm」という名前のファイルが存在することを検出すると、アプリケーションをホストしているアプリドメインを自動的に停止します。公開プロセスが完了すると、App_Offline.htmファイルが削除され、サイトが再びオンラインになります。

アプリケーションのオフライン化に関するMicrosoftの記事 を参照してください。

更新-22/5/2019

App_offlineファイルを作成することで指摘する価値があるかもしれません。

  1. IISはnewリクエストの処理を即座に停止し、app_offlineファイルの内容を含むHTTP 503の「一時的に利用できない」応答を返し始めます。
  2. IISは、w3wp.exeのインスタンスの終了につながる一連のイベントを開始します。これは、「アプリドメイン」です(タスクマネージャーに表示されます)。つまり、ロックの所有者です。そのプロセスが終了すると、すべてのロックが解放されます。私の経験では、それは通常非常に迅速です。

いくつかの高トラフィックサイトの個人的/苦い経験に基づいており、絶対的な最後の手段として...何らかの理由でIISサイトがロックを停止/解放しない/既存のリクエストを中止しない場合)ロードまたはプロセスの終了をブロックする何か-app_offlineは、通常の状況下でサイトを非常に迅速に強制終了します。これらのケースでは、リクエストが完了しないことがわかっているか、気にせずにサイトを停止または再起動する必要がある場合は、アプリを作成しますオフラインファイル、タスクマネージャーを使用してw3wp.exeプロセスを強制終了し、変更を実行してから、アプリのオフラインファイルを削除します。次のリクエストにより、新しいアプリドメインが開始されます(保留中のリクエストは明らかに破棄されます。これを行う場合は注意してください)。サイトによっては問題にならない)。

7
MisterSmith

ビジュアルスタジオの問題のようです。

構成マネージャーの「リリース」および「デバッグ」オプションをいじっているときに、同じエラーが発生し始めました。

  • Binおよびobjフォルダーも削除しようとしましたが、dllファイルがIIS Express worker processによってロックされていたため、成功しませんでした。

  • 運が悪いのにビジュアルスタジオを再起動しようとした。

最後に、構成を「デバッグ」に変更してアプリケーションをコンパイルしたところ、エラーや警告なしにビルドが成功しました。

その後、構成を "Release"に戻しても、dllファイルのロックエラーは表示されませんでした。だから、おそらくそれはビジュアルスタジオの内部バグです。 enter image description here

3
salman