最近、各サイトのウォームアップにかかる時間を最小限に抑えるために、Azure プロジェクトの 1 つにアプリケーションの初期化を実装しました。
私は基本的に、このブログ投稿で概説されている手順をほぼ正確に実装しました。
新しい展開では、IIS の 10 のサイトすべてで機能します。ただし、問題は、その展開を試してアップグレードすると、各サイトの最初の 25 リクエストに対して 500 エラーが発生することです。
現在、これは理想的ではありません。デプロイ後にウォームアップするために各サイトを 1 回ヒットする代わりに、500 秒を超える前に各サイトを約 25 回ロードする必要があるからです。しかし、それらはそこで止まることはなく、散発的に発生するようです。
展開後にマシンのイメージを再作成すると、問題が解決します。ただし、ダウンタイムを犠牲にして、これはオプションではありません。
何か案は?
私は次のものを持っています:
アプリケーション初期化モジュールを有効にする ServiceDefinition.csdef のスタートアップ タスク:
<Task commandLine="enableApplicationInitializationIIS.cmd" executionContext="elevated"></Task>
次に、そのタスク内に次のものがあります。
PKGMGR.EXE /iu:IIS-ApplicationInit
ServiceConfiguration.csfg で、最新のものをセットアップしましたosFamily
:
<ServiceConfiguration serviceName="Foo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="3" osVersion="*" schemaVersion="2012-10.1.8">
次に、Web ロールで、アプリケーションの初期化に必要なすべての設定を有効にするために、次のようにします。
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
using (var serverManager = new ServerManager())
{
foreach (var site in serverManager.Sites)
{
foreach (var application in site.Applications)
{
application["preloadEnabled"] = true;
}
site.ServerAutoStart = true;
}
serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = new TimeSpan(00, 00, 00);
serverManager.ApplicationPoolDefaults.Recycling.PeriodicRestart.Time = new TimeSpan(00, 00, 00);
serverManager.ApplicationPoolDefaults["startMode"] = "AlwaysRunning";
foreach (var appPool in serverManager.ApplicationPools)
{
appPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
return true;
}
}
最後に、私の各サイトには次のものがあります。
<system.webServer>
<applicationInitialization skipManagedModules="true">
<add initializationPage="/" />
</applicationInitialization>
</system.webServer>
でも何がわからないskipManagedModules
のですか?