24

为了防止 AppPool 每 20 分钟回收一次,我想在我的 Azure Web 角色启动时删除 IIS AppPool Idle Timeouts。我的网站是一个 Web 应用程序项目。

我该怎么做呢?

4

6 回答 6

32

创建启动任务以禁用空闲超时:

  1. 在您的 Web 角色项目引用的网站项目中,将文件添加Startup.cmd到根文件夹。

  2. 在 的属性中Startup.cmd,将Copy to Output Directory设置为Copy if newer

  3. 将此行添加到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。

  4. 将文件另存为不带签名的 UTF-8。( Visual Studio 中的文件 > 高级保存选项。)

  5. 在您的 Web 角色项目中ServiceDefinition.csdef,将其添加到WebRole

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="elevated" />
    </Startup>
    
于 2013-12-11T17:12:22.710 回答
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 云服务配置文件 (.cscfg) 才能使用 OS 系列 4,如 scottgu 在他的博客文章中所述。

由于启动操作在您的实例被配置时和 Web 应用程序部署到 IIS 之前运行,通过设置应用程序池默认值将事实上将您的应用程序应用程序池 idel 超时操作设置为暂停。

于 2013-10-30T14:53:05.240 回答
2

不要打扰。无论如何,您确实应该为您的 Web 角色提供监控解决方案。现在它已内置到 Azure 仪表板中,打开监控比正确配置空闲超时更容易(尤其是如果您想保持最低权限)。

于 2014-01-07T16:26:12.047 回答
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");
    }
}
于 2013-08-06T20:07:30.803 回答
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 -?
于 2016-12-12T22:40:16.650 回答
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;
于 2013-12-29T23:20:39.227 回答