为防止App Pool每20分钟回收一次,我想在Azure Web角色启动时删除IIS App Pool Idle Timeouts。我的网站是一个Web应用程序项目。
我该怎么做?
答案 0 :(得分:32)
创建启动任务以禁用空闲超时:
在您的网络角色项目引用的网站项目中,将文件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中的文件>高级保存选项。)
在您的网络角色项目的ServiceDefinition.csdef
中,将其添加到WebRole
:
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" />
</Startup>
答案 1 :(得分:4)
另一种选择是将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系列4,如scottgu在其blog post中所述。
由于在配置实例时以及在将Web应用程序部署到IIS之前运行启动操作,因此通过设置应用程序池默认值将defacto将应用程序apppool idel time out操作设置为Suspend。
答案 2 :(得分:2)
在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");
}
}
答案 3 :(得分:2)
答案 4 :(得分:1)
除了@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 -?
答案 5 :(得分:0)
这是我采取的方法:
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;