2013-01-09 90 views
6

我在azure上有一個web角色,我想在不等待第一個請求的情況下強制Application_Start。在Azure Web角色上強制應用程序啓動

我設法設置「自動啓動」屬性設置爲true在我的網站

AutoStart a WCF on Azure WebRole

不過的Application_Start不叫,直到第一個請求到達。

我不知道我是否缺少重要的東西。服務器是W2008 R2和IIS版本是7.5

謝謝!

SOLUTION

我把解決代碼在這裏。我希望能幫助別人。我剛剛添加了一個WebRole.cs,並且只需將該代碼每隔30秒執行一次ping即可。請netice我正在瀏覽Service.svc,因爲這是我的端點,您的端點可能是另一個端點。注意我要求「Endpoint1」。如果您有多個端點,則應該查看該行。

public class WebRole : RoleEntryPoint 
{   
    public override void Run() 
    {    
     var localuri = new Uri(string.Format("http://{0}/Service.svc", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint)); 

     while (true) 
     { 
      try 
      {      
       var request = (HttpWebRequest)WebRequest.Create(localuri); 
       request.Method = "GET"; 
       var response = request.GetResponse(); 
      } 
      catch { } 
      System.Threading.Thread.Sleep(30000); 
     }    
    } 

    public override bool OnStart() 
    {    
     return base.OnStart(); 
    } 
} 

回答

3

IIS只會在第一個請求到達時啓動。解決方法是從OnStart或您的RoleEntryPoint後代向同一虛擬機發送HTTP請求 - 使用WebRequest或同等級別很容易。

+0

這就是我現在正在嘗試的內容XD – Jordi

+0

我剛剛用這個解決方案編輯了我的解決方案。謝謝! – Jordi

+0

我爲客戶使用4種生產環境的相同解決方案。必須有多個節點(實例),隨機請求會突然很慢,顯然是因爲它們在這些請求上運行App Start。如果需要,可以提供代碼嗎? – Ash

1

霍迪,我最近經歷過同樣的問題。

基於我的測試Application_Start()僅在WebApp的第一個請求ISS時被調用。 (如果您嘗試在Debug中打開VS而沒有打開任何頁面(請參閱proj/debug中的選項),您將看到如果不在Azure中運行WebApp,也將不會調用Application_Start())

我想,你需要做的有些事情當WebRole開始,以及把你的代碼在WebRole.cs) 在這裏,您可以覆蓋的OnStart()和調用OnStop(),把你的代碼wiil被execuded當WebRole將開始。

我已經使用這種方式運行一個獨立於IIS執行某些計劃任務的BakgroundWorker。

我希望這個幫助。 Davide。

注: 1 - 如果你dont'have一個WebRole.cs在項目的根目錄創建並寫入內部: 公共類WebRole:RoleEntryPoint { 公共覆蓋布爾的OnStart(){ ... 你的代碼... return base.OnStart(); } }

2 - 如果你需要調試代碼記住,你需要在調試與Azure項目引用Web應用程序爲「運行項目」否則運行VS WebRole將不會被調用

+1

請注意,WebRole.cs中的代碼與IIS不同的進程運行。因此,某些類型的初始化(內存中的預加載數據,打開連接等)不能在那裏完成。 –

+0

感謝Brian,這確切是發生在我身上的事情:( – Jordi

1

您可以嘗試在WebRole.cs中添加一些代碼以從您的網站請求一些URL。我已經嘗試過了,它似乎有點用。但調試很痛苦,所以我從來沒有真正明白過。

另一種選擇是使用IIS Application Initialization。您不能在IIS 7.5上使用它,但如果將角色升級到Windows 2012(在.cscfg中設置osFamily =「3」),則可以獲得IIS 8。

相關問題