1

ASP.NETがaspxファイルやDLLなどの特定のファイルへの変更を検出したことだけを読み取ることができました。自動的に再起動し、現在実行中のリクエストと新しいリクエストを新しくデプロイされたファイルで終了します。

しかし、最初のファイルがコピーされてから最後のファイルが交換されるまでの間に何が起こっているのでしょうか。最初のDLLファイルを交換すると、リクエストが届きますが、他のDLLファイルは古いバージョンになっています-クラッシュするだけですか?asp.netは数秒間待機し、(関連する)ファイルが変更されていないX秒後にのみ新しく起動しますか?

どうも!

4

1 に答える 1

2

ここに4つの質問があります。 最初のファイルがコピーされてから最後のファイルが交換されるまでの間に何が起こっているのでしょうか。-.netが他のファイルが変更されているかどうかを確認してから、新しいdllがロードされた状態で新しいアプリドメインを起動するまで、一定の時間があります。

最初のDLLファイルを交換すると、リクエストが届きますが、他のDLLファイルは古いバージョンになっています-クラッシュするだけですか?-これは、dllにどのようなコード変更があるかによって異なります。新しいdllが古いコードで正常に実行できる場合は、正常に動作します。ただし、アプリドメインが新しいDLLを起動し、その新しいdllがまだ存在しないものに依存している場合は、例外がスローされます。

asp.netは数秒間待機し、(関連する)ファイルが変更されていないX秒後にのみ新しく起動しますか?- はい。その時間がどれくらいあるかわかりませんでした。しかし、私の個人的な経験では、それは1〜2秒の範囲のどこかにあります。

また、アプリドメインとDLLの再読み込みについての良い説明をここで見つけました:http: //odetocode.com/Articles/305.aspx

更新されたdllをアプリケーションのbinサブディレクトリにコピーすると、ASP.NETランタイムは実行する新しいコードがあることを認識します。ASP.NETはdllを既存のAppDomainにスワップできないため、新しいAppDomainを開始します。古いアプリケーションドメインは「ドレイン停止」されます。つまり、既存のリクエストは実行を終了でき、すべて終了するとAppDomainはアンロードできます。新しいAppDomainは新しいコードで始まり、すべての新しいリクエストの受け取りを開始します。

通常、dllがプロセスにロードされると、プロセスはdllをロックし、ディスク上のファイルを上書きすることはできません。ただし、AppDomainには、アセンブリをロック解除したままディスク上で交換できるようにするシャドウコピーと呼ばれる機能があります。

ランタイムは、binディレクトリに対してシャドウコピーを有効にしてASP.NETを初期化します。AppDomainは、必要なdllをbinディレクトリから一時的な場所にコピーしてから、dllをロックしてメモリにロードします。シャドウコピーを使用すると、Webアプリケーションをオフラインにすることなく、更新中にbinディレクトリ内のdllを上書きできます。

于 2010-04-06T16:52:42.337 に答える