Iis Azure:如何执行延迟的启动任务?

Iis Azure:如何执行延迟的启动任务?,iis,azure,azure-web-roles,appcmd,azure-configuration,Iis,Azure,Azure Web Roles,Appcmd,Azure Configuration,我的WebRole中有两个站点,并定义了启动任务 第一行很好,它为我创建了一个新的应用程序池: %WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" 现在我想把我的第二行更改为这个新创建的AppPool,但在后面添加另一行并没有帮助 %WINDIR%\system32\inetsrv\appcm

我的WebRole中有两个站点,并定义了启动任务

第一行很好,它为我创建了一个新的应用程序池:

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"
现在我想把我的第二行更改为这个新创建的AppPool,但在后面添加另一行并没有帮助

%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"
第二个网站似乎还没有准备好

如何将任务延迟30秒或略微延迟appcmd.exe? 除非有办法为此启动任务创建依赖项,否则只能在第二个站点启动并运行时执行该任务

任何帮助都将不胜感激, 非常感谢,

是否有办法将此执行延迟30秒,以确保第二个站点已启动并且可以更改

更新:

谢谢你的提示。我已对此事作了进一步调查。我找到了OnStart()事件

1) 但是,由于我使用silverlight并简单地将现有的Web项目包装在Cloud Roles项目中,因此我不会有这样的WebRole.cs。我可以把它添加到我的Silverlight Web项目中并在那里使用吗?还是建议从头开始创建WebRole项目,并将其全部替换为Silverlight Web项目

2) 关于服务定义中的
标记,我是否可以这样简单地添加它?当webrole提升运行时,它会有任何安全影响吗


...
3) 最后但并非最不重要的一点是,如何运行cmd文件或实际上是这一行

%WINDIR%\system32\inetsrv\appcmd.exe set site /site.name:"WebRole_IN_0_VC" /[Path='/'].applicationPool:"ASP.NET v4.0" >>Log.txt

在OnStart()方法中?

可以探索使用PowerShell脚本执行这些任务。PowerShell有一种睡眠线程的方法。差不多

批处理文件

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"
powershell -command "Set-ExecutionPolicy Unrestricted" 2>> err.out 
powershell .\sleep.ps1 2>> err.out
%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

我还没试过,但应该能用。请参阅此部分了解Powershell集成。

正如您所发现的,该站点是在“任务”部分运行后创建的。相反,从“OnStart”事件运行代码。该站点将在该点创建。您可能需要更新服务定义文件以运行您的角色“提升”,这可以通过添加以下标记来完成:

<Runtime executionContext="elevated"/>

有关在此处启动流程的更多信息:

对于感兴趣的人。。。我刚刚在博客中介绍了如何在Windows Azure配置IIS网站上执行AppCmd启动任务,包括按web角色名称查找网站,并延迟执行,以便网站配置已由Azure的IISConfigurator.exe创建

更多信息请点击此处:

谢谢,
Mike

那么任务部分在创建站点之前运行?这是个坏消息。因此,延迟将不起作用。当您说“OnStart”事件时,您的意思是在ServiceDefinition文件中吗?我认为你的文章在中间被砍掉了。OnStand是一个在你的角色中实现RoeRealTyPoin的类中重写的方法(通常是WorkReor或WebRole)。嗨,李察,你是对的,这些任务在站点生成之前就已经被执行了。我现在可以在日志文件中看到它。看来你的解决方案可能是最可靠的。我甚至联系了Microsoft Azure支持部门,但迄今为止他们无法帮助我。如果您能阅读我在问题中更新的部分并为我进一步澄清,我将不胜感激。非常感谢Hi@Kave,我添加了一些额外的答案。我希望这对你有帮助谢谢你的帮助Richard。因为我使用的是PHPAzure,而PHPAzure反过来又从PHP文件创建Azure包,所以我没有真正的控件来覆盖任何内容。我的Silverlight Web项目只是发布到一个文件夹中。我将此文件夹的路径添加到第二个站点的物理路径。如果创建包是由VS驱动的,那么就不会有问题,您的解决方案也会起作用。但不幸的是,我的情况并非如此。我不得不用骇人的方式把后台任务延迟90秒。我希望有更好的方法…感谢您的回复,所以当我将powershell放入其中时。\sleep.ps1 2>>err.out,我是否必须用以下行填充sleep.ps1:Start sleep-s 30?但问题仍然存在,如果将此任务作为后台运行并具有30秒的延迟将有所帮助,如果在任务执行后创建…sleep.ps1将包含与延迟相关的代码。即使您将其作为后台任务运行,您也无法确定第二个站点是否已创建。如果Powershell允许类似的功能,如appcmd.exe。您可以使用它构建重试直至成功的机制。您应该将博客中的相关部分复制并粘贴到此答案。没有这一点,你的答案是无用的。当此链接消失时,您的答案将变得无用。
System.Diagnostics.Process.Start("OnStart.cmd")