在Azure Web角色中禁用IIS空闲超时
为防止AppPool每20分钟回收一次,我想在Azure Web角色启动时删除IIS AppPool空闲超时。 我的网站是一个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
:
另一种选择是将IIS空闲超时操作配置为“挂起”。 您可以将其作为Web角色启动脚本的一部分来执行。
作为IIS设置的一部分,您需要的命令在盒子上(请注意,这将适用于Windows Server 2012 R2及更高版本,您的代码将针对.NET 4.5.1框架及更高版本)。
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend
您必须更新Azure Cloud Service配置文件(.cscfg)以使用OS Family 4,如scottgu在其博客文章中所述 。
由于在配置实例时以及在将Web应用程序部署到IIS之前运行启动操作,因此通过设置应用程序池默认值,将defacto将应用程序apppool idel time out操作设置为Suspend。
在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"); } }
不要打扰。 无论如何,您确实应该为您的Web角色提供监控解决方案。 现在它已内置到Azure仪表板中,开启监控比获得正确的空闲超时配置更容易(特别是如果您想保持最低权限)。
除了@Edward Brey回答,如果你想更改该启动脚本中的其他常用设置,这里是你如何做到这一点
rem Preload %windir%\system32\inetsrv\appcmd list app /xml | %windir%\system32\inetsrv\appcmd set site /in -applicationDefaults.preloadEnabled:True rem Disable idle %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 rem Auto start %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.autoStart:true rem Always running %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning rem Disable recycling %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00
要查看每个部分的可用选项列表,请执行
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -?
这是我采取的方法:
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;