Я обнаружил, что выполнение запросов к нашей веб-роли после периодов бездействия приведет к очень медленному запросу (до 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();
}
Это также требует, чтобы роль выполнялась на повышенном уровне.
(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);
}
}
(c) Установите preloadEnabled
и startMode
в RoleEntryPoint.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();
}
(d) И, наконец, используя Azure "Always On" (EDIT: это только для сайтов Azure, к сожалению!)
Какую из этих стратегий я должен выполнить?