2011-11-27 71 views
2

我在WebRole中有两个站点并定义了一个启动任务。Azure:如何执行启动任务延迟?

第一行正常工作,它为我创建一个新的应用程序池:

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" 

现在,我想我的第二次改变这个新创建的应用程序池,但之后加入另一行,不帮帮我。

%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)关于服务定义中的<Runtime/>标签,我是否简单地将它添加为这样?当卷筒纸运行升高时它会有什么安全隐患吗?

<WebRole name="WebRole" enableNativeCodeExecution="true" vmsize="ExtraSmall"> 
    <Runtime executionContext="elevated"/> 
    <Sites> 
     <Site name="WebRole" physicalDirectory="./WebRole"> 
     ... 
    </Sites> 
</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()方法

回答

3

您可以探索使用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集成,请参阅此post

+0

感谢您的答复,所以当我把PowerShell的\ sleep.ps1 2 >> err.out在那里,我必须来填充这一行sleep.ps1:开始 - 睡觉 - 30岁?但问题仍然存在,如果将此任务作为背景执行,并且延迟30秒会有所帮助,如果是在任务执行后创建的... – Houman

+0

sleep.ps1将包含与延迟相关的代码。即使您将其作为后台任务运行,您也无法确定第二个站点是否已创建完毕。如果Powershell允许类似appcmd.exe的功能。你可以建立一个重试直到使用它的成功机制。 – Chandermani

2

正如您发现的,该网站是在“任务”部分运行后创建的。相反,从'OnStart'事件运行你的代码。该网站将由此创建。您可能需要更新您的服务定义文件中加入此标记来运行你的“升高”这是可以做到的作用:

<Runtime executionContext="elevated"/> 

编辑

为了回答您的其他问题:

1 )无论你有什么项目,你都应该能够添加RoleEntryPoint类。您可能必须手动执行此操作。

2)添加运行时标签不会为您的部署添加任何重大风险。

3)创建一个cmd文件,把你的命令(即OnStart.cmd),并使用一些像这样的代码:

System.Diagnostics.Process.Start("OnStart.cmd") 

更多信息,从这里开始的过程:http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

+0

因此,任务部分在Site创建之前运行?这是个坏消息。所以延迟不会奏效。当你说'OnStart'事件时,你的意思是在ServiceDefinition文件中吗?我认为你的帖子在中间被切断了。 – Houman

+0

OnStart是您应该在角色中实现RoleEntryPoint的类中重写的方法(通常为WorkerRole或WebRole)。 –

+0

嗨,理查德,你说得对,这些任务在网站生成之前真正执行。我现在可以在日志文件中看到它。看来你的解决方案可能是最可靠的。我甚至联系了Microsoft Azure支持人员,并告诉他们不能帮助我。如果你能在这个问题中阅读我更新的部分,并且为我进一步阐明它,我将不胜感激。非常感谢 – Houman

1

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

更多这里:http://mvolo.com/configure-iis-websites-windows-azure-startup-tasks-appcmd/

谢谢, 迈克

+0

你应该复制并粘贴你的博客相关部分到这个答案。没有这个,你的答案是无用的。当这个环节死了,你的答案变得毫无用处。 –