我们在Windows Azure中托管的Web角色使用旧的基于ASMX的Web Reference来联系外部系统。 Web Reference代理代码足够大,第一次实例化它会产生很大的成本。
我们希望能够在Web角色启动而不是第一次请求时运行。
我知道IIS 7.5有一个Application Warm-Up模块可以让我们实现这个目标,但是我无法弄清楚在Windows Azure上是否存在类似的东西。
谢谢, 科里
答案 0 :(得分:5)
我喜欢Steve Marx的解决方案。
将此行添加到 ServiceDefinition.csdef:
<Startup>
<Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" />
</Startup>
在名为 startup 的文件夹中添加 disableTimeout.cmd ,并使用以下代码行:< / p>
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
此处的原始解决方案:http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure
在模拟器中运行时请阅读:http://blog.smarx.com/posts/skipping-windows-azure-startup-tasks-when-running-in-the-emulator
答案 1 :(得分:1)
看起来Global.asax中的Application_Start处理程序在部署Web角色时(对于ASP.NET)而不是第一个请求时执行,因此这对我们有效。
答案 2 :(得分:0)
有关此内容的更新,下面的文章介绍了如何配置Windows Azure WebRole
:
您可以使用以下命令在启动批处理脚本中安装模块:
PKGMGR.EXE /iu:IIS-ApplicationInit
然后在WebRole中(我已将其改编为与托管多个网站的WebRole一起使用):
public class WebRole : RoleEntryPoint
{
public override void Run()
{
using (var serverManager = new ServerManager())
{
// The foreach ensures we enable initialization for all websites hosted on this WebRole.
foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var applicationPool in serverManager.ApplicationPools)
{
applicationPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
base.Run();
}
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
return base.OnStart();
}
}
答案 3 :(得分:-1)
由于在Windows Azure上托管Web角色的VM的唯一目的是回答Web请求,我认为这种调整是云操作系统的责任,而不是云应用程序。话虽这么说,检查Azure云操作系统是否确实可以在默认情况下进行此类调整可能会很有趣。