我发现,在不活动一段时间后向我们的web角色发出请求将导致非常慢的请求(长达30秒)。在最初的请求之后,角色将按其应有的方式执行。
经过大量的谷歌搜索,我发现了四种不同的策略(如下所示):
(a)在RoleEntryPoint.OnStart()
中禁用IIS空闲超时
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)在RoleEntryPoint.OnStart()
中设置preloadEnabled
和startMode
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“(编辑:不幸的是,这只适用于Azure网站!)
我应该执行这些策略中的哪一个?
发布于 2014-07-11 03:23:04
我们使用了这些答案的组合,它对我们来说工作得很好,他们非常快地改变和测试,然而,它似乎涵盖了所有的基础。
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();
}
发布于 2014-07-11 06:40:14
您是否考虑过使用Azure端点监控来监控和触发您的角色每5分钟响应一次?它内置于Azure中,不需要任何代码。
http://azure.microsoft.com/en-us/documentation/articles/web-sites-monitor/
https://stackoverflow.com/questions/24676194
复制相似问题