2011-11-27 76 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

你應該複製並粘貼你的博客相關部分到這個答案。沒有這個,你的答案是無用的。當這個環節死了,你的答案變得毫無用處。 –