Azure Web角色"热身"策略

Dav*_*New 19 azure azure-web-roles azure-configuration iis-8

我发现在不活动期间向我们的Web角色发出请求会导致请求非常慢(最多30秒).在初始请求之后,角色将按预期执行.

经过大量谷歌搜索,我遇到了四种不同的策略(如下所列):

(a)禁用IIS空闲超时 RoleEntryPoint.OnStart()

public override bool OnStart()
{
    using (var server = new ServerManager())
    {
        server.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
        server.CommitChanges();
    }

    return base.OnStart();
}
Run Code Online (Sandbox Code Playgroud)

这也要求角色在更高的层次上运行.

(b)定期提出要求 RoleEntryPoint.Run()

public override void Run()
{
    var localuri = new Uri(string.Format("https://{0}/Help", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpsIn"].IPEndpoint));

    while (true)
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.Create(localuri);
            request.Method = "GET";
            var response = request.GetResponse();
        }
        catch { }
        System.Threading.Thread.Sleep(3000);
    }
}
Run Code Online (Sandbox Code Playgroud)

(c)设置preloadEnabledstartModeRoleEntryPoint.OnStart()

public override void OnStart()
{
    using (var serverManager = new ServerManager())
    {
        foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
        {
            application["preloadEnabled"] = true;
        }

        foreach (var applicationPool in serverManager.ApplicationPools)
        {
            applicationPool["startMode"] = "AlwaysRunning";
        }

        serverManager.CommitChanges();
    }

    return base.OnStart();
}
Run Code Online (Sandbox Code Playgroud)

(d)最后,使用Azure的"Always On"(编辑:不幸的是,这仅适用于Azure网站!)

Azure角色始终开启

我应该执行以下哪些策略?

Pet*_*Lea 17

我们使用了几个答案的组合,它对我们非常有效,它们很快就可以改变和测试,但它似乎涵盖了所有基础.

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;
    if(!RoleEnvironment.IsEmulated)
    {
        using(ServerManager serverManager = new ServerManager())
        {
            foreach (var app in serverManager.Sites.SelectMany(x => x.Applications))
            {
                app["preloadEnabled"] = true;
            }
            foreach (var appPool in serverManager.ApplicationPools)
            {
                    appPool.AutoStart = true;
                    appPool["startMode"] = "AlwaysRunning";
                    appPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
                    appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
            }
            serverManager.CommitChanges();
        }
    }
    return base.OnStart();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在角色实例启动时遇到配置文件访问权限错误,则可能需要在ServiceDefinition.csdef中将`<Runtime executionContext ="elevated"/>`添加到`<WebRole>`元素. (7认同)
  • 需要在`C:\ Windows\System32\inetsrv`下引用`Microsoft.Web.Administration.dll` (2认同)