2013-01-09 10 views
6

Ich habe eine Webrolle auf azurblau und möchte einen Application_Start erzwingen, ohne auf die erste Anfrage zu warten.Anwendung erzwingen Starten auf Azure-Webrolle

ich es geschafft, die „Automatisch starten“ Eigenschaft auf true

AutoStart a WCF on Azure WebRole

Aber die Application_Start nicht genannt auf meiner Seite gesetzt, bis die erste Anforderung kommt.

Ich weiß nicht genau, ob ich hier etwas Wichtiges vermisse. Der Server ist ein W2008 R2 und die IIS-Version ist 7,5

Vielen Dank!

SOLUTION

habe ich den Lösungscode hier. Ich hoffe, wird jemandem helfen. Ich habe gerade eine WebRole.cs hinzugefügt und diesen Code eingefügt, um alle 30 Sekunden einen Ping auszuführen. Bitte nettice Ich suche Service.svc, weil dies mein Endpunkt ist, Ihr Endpunkt könnte ein anderer sein. Hinweis Ich frage nach "Endpoint1". Wenn Sie mehr als einen Endpunkt haben, sollten Sie diese Zeile überprüfen.

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(); 
    } 
} 

Antwort

3

Der IIS wird nur gestartet, wenn die erste Anforderung eintrifft. Die Problemumgehung besteht darin, eine HTTP-Anforderung von OnStart oder RoleEntryPoint descendant an dieselbe VM zu senden - das ist einfach mit WebRequest oder einer entsprechenden Klasse.

+0

das ist, was ich im Moment XD ich versuche – Jordi

+0

ich meine queistion nur mit dieser Lösung bearbeitet. Vielen Dank! – Jordi

+0

ich die gleiche Lösung für Kunden für 4 Produktionsumgebung. Es ist ein Muss mit mehreren Knoten (Instanzen), zufällige Anfragen würden plötzlich sehr langsam sein. Offensichtlich, weil sie App Start für diese Anfragen ausgeführt haben. Kann Code liefern, wenn Sie es wollen? – Ash

1

Jordi, ich habe kürzlich das gleiche Problem erlebt.

Basierend auf meinem Test wird Application_Start() NUR aufgerufen, wenn die erste ISS für die WebApp anfordern. (Wenn Sie versuchen, VS in Debug zu starten, ohne dass es eine Seite öffnet (siehe Optionen in proj/debug), werden Sie sehen, dass Application_Start() auch nicht aufgerufen wird, wenn Sie die WebApp nicht in Azure ausführen)

ich nehme an, dass Sie tun Somethings müssen, wenn die WebRole Start, auch der Code in denWebRole.cs setzen;) Hier können Sie OnStart() überschreiben und OnStop() und Code setzen, die execuded werden wiil, wenn die WebRole wird gestartet.

Ich habe diesen Weg verwendet, um einen BakgroundWorker auszuführen, der einige geplante Aufgaben unabhängig von IIS ausführt.

Ich hoffe diese Hilfe. Davide.

Hinweis: 1 - wenn Sie dont'have ein WebRole.cs es in der Wurzel des Projekts erstellen und schreiben innen: public class WebRole: RoleEntryPoint { public override bool OnStart() { ... Ihr Code ... return base.OnStart(); } }

2 - Wenn Sie brauchen den Code Geist zu debuggen, die Sie benötigen VS im Debug mit dem Azure Projekt, die WebApp siehe als "Run Project", laufen sonst die WebRole wird nicht aufgerufen

+1

Beachten Sie, dass Code in WebRole.cs in einem anderen Prozess als IIS ausgeführt wird. Einige Initialisierungsarten (Laden von Daten im Speicher, Öffnen von Verbindungen usw.) können dort nicht durchgeführt werden. –

+0

Dank Brian, das war genau, was mir passiert :( – Jordi

1

Sie könnten versuchen, Code in Ihre WebRole.cs zu setzen, um einige URLs von Ihrer Website anzufordern. Ich habe es versucht, und es scheint etwas zu funktionieren. Aber es ist mühsam zu debuggen, also habe ich es nie wirklich fertig gemacht.

Eine andere Option wäre IIS Application Initialization zu verwenden. Sie können es nicht in IIS 7.5 verwenden, aber Sie können IIS 8 erhalten, wenn Sie Ihre Rollen auf Windows 2012 aktualisieren (legen Sie osFamily = "3" in Ihrer .cscfg fest).

Verwandte Themen