AppPool が 20 分ごとにリサイクルされるのを防ぐために、Azure Web ロールの開始時に IIS AppPool Idle Timeouts を削除したいと考えています。私のウェブサイトは Web アプリケーション プロジェクトです。
どうすればいいですか?
AppPool が 20 分ごとにリサイクルされるのを防ぐために、Azure Web ロールの開始時に IIS AppPool Idle Timeouts を削除したいと考えています。私のウェブサイトは Web アプリケーション プロジェクトです。
どうすればいいですか?
アイドル タイムアウトを無効にするスタートアップ タスクを作成します。
Web ロール プロジェクトによって参照される Web サイト プロジェクトでStartup.cmd
、ルート フォルダーにファイルを追加します。
のプロパティで、[出力ディレクトリにコピー] を [新しい場合Startup.cmd
はコピー]に設定します。
この行を に追加しStartup.cmd
ます。
if exist %windir%\system32\inetsrv\appcmd.exe %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
if exist %windir%\system32\inetsrv\appcmd.exe
修飾子はオプションです。Azure Emulator Express で同じコードを使用できるため、IIS をインストールしたり、管理者として Visual Studio を実行したりする必要はありません。
ファイルを署名なしの UTF-8として保存します。( Visual Studio で[ファイル] > [高度な保存オプション] を選択します。)
Web ロール プロジェクトの でServiceDefinition.csdef
、これを に追加しますWebRole
。
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" />
</Startup>
もう 1 つのオプションは、IIS アイドル タイムアウト アクションを「中断」に構成することです。これは、Web ロールの起動スクリプトの一部として実行できます。
必要なコマンドは、IIS セットアップの一部としてボックスに含まれています (これは、.NET 4.5.1 フレームワーク以降を対象とするコードを使用して、Windows Server 2012 R2 以降で動作することに注意してください)。
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend
OS ファミリ 4 を使用するには、Azure Cloud Service 構成ファイル (.cscfg) を更新する必要があります。
インスタンスがプロビジョニングされ、Web アプリケーションが IIS にデプロイされる前に起動アクションが実行されるため、アプリケーション プールのデフォルトを設定すると、事実上、アプリケーションの apppool idel タイムアウト アクションが Suspend に設定されます。
気にしないでください。とにかく、Web ロールの監視ソリューションが本当に必要です。Azure ダッシュボードに組み込まれているため、アイドル タイムアウトの構成を適切に設定するよりも、監視を有効にする方が簡単です (特に、最小限の特権を維持したい場合)。
Web アプリケーション プロジェクトのルートでWebRole.cs
、次のコードで名前が付けられたファイルを作成します。
public class WebRole : RoleEntryPoint
{
public override void Run()
{
RemoveIISTimeouts();
base.Run();
}
private void RemoveIISTimeouts()
{
Process.Start(
String.Format(@"{0}\system32\inetsrv\appcmd", Environment.GetEnvironmentVariable("windir")),
"set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00");
}
}
これは私が取ったアプローチです:
using (ServerManager iisManager = new ServerManager())
{
Application app = iisManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications[0];
TimeSpan ts = new TimeSpan(0, 00, 00);
iisManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = ts;
iisManager.CommitChanges();
}
必要:
using Microsoft.Web.Administration;
using Microsoft.WindowsAzure.ServiceRuntime;