4

最近、各サイトのウォームアップにかかる時間を最小限に抑えるために、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のですか?

4

1 に答える 1

2

同様の問題が発生し、あなたの投稿を見つけました。私の場合、この問題は初期展開とアップグレード展開ですでに発生していました。

エラー ログに、「値を null にすることはできません」という例外が見つかりました。ServerManager が初期化できなかったようです - using ステートメント内のコードが実行されませんでした。アセンブリ Microsoft.Web.Administration (Windows 7 から) を Windows Server 2012 マシンに展開しようとしたことが判明しました。

正しいバージョンを適用すると、500 エラーはなくなりました。

System.TypeInitializationException: The type initializer for 'Microsoft.Web.Administration.ConfigurationManager' threw an exception. 
System.ArgumentNullException: Value cannot be null.
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Microsoft.Web.Administration.ConfigurationManager..cctor()
--- End of inner exception stack trace ---
at Microsoft.Web.Administration.ConfigurationManager..ctor(ServerManager owner, String applicationHostConfigurationPath)
at Microsoft.Web.Administration.ServerManager..ctor(String applicationHostConfigurationPath)

編集:

初期化時に 500 エラーが発生し続けましたが、これらは 2 つのタグが原因で発生しているようです。

<applicationInitialization remapManagedRequestsTo="app_starting.htm" skipManagedModules="true" >
    <add initializationPage="/" />
</applicationInitialization>

remapManagedRequestsTo 属性と skipManagedModules 属性を削除すると、500 エラーが削除されるようです。IIS 7.5 Application Initialization for ASP.NET Web service (warmup) without remapping requests を参照してください。

于 2013-11-22T17:46:52.247 に答える