9

編集:これは以前、「IIS の再起動とアプリケーションの初期化の間で異なる App Init の動作」と題されていました。観察された動作が関連しているため、IIS/アプリケーションの初期化から質問を拡大するためにタイトルを変更しましたAppDomain.CurrentDomain.GetAssemblies();

IIS アプリケーション初期化モジュールを使用して asmx wed サービスをウォームアップしています。

アプリ アプリケーションの初期化が成功するように、いくつかのウォームアップ コードを実装しました。Global.asax Application_Start イベントで asmx サービスを JIT します。これは、System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod() を使用して、アプリケーション内のすべてのアセンブリを反復処理し (アセンブリの依存関係もすべて取得します)、サービスへの最初の呼び出しが可能な限り高速になるようにします。

「net stop w3svc & net start w3svc」を使用してこの動作を観察すると、すべてのアセンブリが JIT されており、サービスへの最初の呼び出しが期待どおりに高速であることが (ログを介して) わかります。

ただし、アプリケーション プールが構成されたタイム スケジュール (03:00:00) で自動的にリサイクルされると、ログには、直接参照されているアセンブリのみが JIT されていることが示され、フォルダー内に存在する依存関係は示されません。

これにより、サービスへの最初の呼び出しで許容できないオーバーヘッドが発生します。

App Init は、他のすべての点で期待どおりに動作しますが、IIS のアプリケーション プールの再循環は、直接参照されているアセンブリのみを JIT コンパイルし、その依存関係はコンパイルしないのはなぜですか?

4

1 に答える 1

15

上記の私のコメントで言及された投稿は私を正しい方向に導き、その後、この投稿で答えを見つけました: AppDomain.GetAssemblies と BuildManager.GetReferencedAssemblies の違い

だから私のコードはに変更されましたvar assemblies = BuildManager.GetReferencedAssemblies();

于 2013-09-12T16:03:35.203 に答える