2013-01-09 12 views
6

Mam rolę sieciową na lazurach i chciałbym wymusić Application_Start bez oczekiwania na pierwsze żądanie.Wymuś uruchomienie aplikacji na platformie Azure Web Rola

udało mi się ustawić „Start automatycznie” właściwość true na mojej stronie

AutoStart a WCF on Azure WebRole

Ale Application_Start nie nazywa dopiero pierwsze żądanie pochodzi.

Nie wiem dokładnie, czy brakuje mi czegoś ważnego tutaj. Serwer to W2008 R2, a wersja IIS to 7.5

Dzięki!

ROZWIĄZANIE

umieścić kod rozwiązanie tutaj. Mam nadzieję, że komuś pomogę. Właśnie dodałem WebRole.cs i po prostu umieść ten kod, aby wykonać ping co 30 sekund. Proszę netice Przeglądam Service.svc, ponieważ jest to mój punkt końcowy, twój punkt końcowy może być inny. Uwaga Pytam o "Endpoint1". Jeśli masz więcej niż jeden punkt końcowy, powinieneś przejrzeć tę linię.

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

Odpowiedz

3

Usługi IIS będą uruchamiane dopiero po otrzymaniu pierwszego żądania. Rozwiązaniem jest wysłanie żądania HTTP do tej samej maszyny wirtualnej z poziomu OnStart lub Twojego potomka RoleEntryPoint - to proste przy użyciu klasy WebRequest lub równoważnej.

+0

to właśnie próbuję w tej chwili XD – Jordi

+0

Właśnie edytowałem moje queistion z tym rozwiązaniem. Dzięki! – Jordi

+0

Używam tego samego rozwiązania dla 4 środowisk produkcyjnych dla klientów. musi z wieloma węzłami (instancjami), przypadkowe żądania nagle staną się naprawdę powolne, oczywiście dlatego, że uruchomiono App Start na tych żądaniach.Może dostarczyć kod, jeśli chcesz? – Ash

1

Jordi, ostatnio doświadczyłem tego samego problemu.

Na podstawie mojego testu Application_Start() jest wywoływana TYLKO przy pierwszym żądaniu ISS dla WebApp. (jeśli spróbujesz uruchomić VS w Debugowaniu bez otwierania jakiejkolwiek strony (zobacz opcje w proj/debug), zobaczysz, że Application_Start() nie będzie wywoływana także, jeśli nie uruchomisz WebApp na Azure)

Przypuszczam, że trzeba robi latków kiedy początek WebRole, dobrze umieścić swój kod w WebRole.cs;) Tutaj można zastąpić onStart() i OnStop() i umieścić swój kod, który wiil być execuded gdy WebRole się uruchomi.

Użyłem w ten sposób uruchomić BakgroundWorker wykonującego niektóre zaplanowane zadania, niezależnie od usług IIS.

Mam nadzieję, że ta pomoc. Davide.

Uwaga: 1 - jeśli dont'have a WebRole.cs utworzyć go w katalogu głównym projektu napisać wewnątrz: publicznej klasy WebRole: RoleEntryPoint {public override bool OnStart() { ... twój kod ... return base.OnStart(); } }

2 - Jeśli trzeba debugować umysł kodu, który trzeba uruchomić VS w debugowania z Azure projektu, które odnoszą się do aplikacji sieci Web jako „Run Project”, inaczej WebRole nie będzie nazywane

+1

Należy zauważyć, że kod w pliku WebRole.cs działa w innym procesie niż IIS. Tak więc niektóre rodzaje inicjalizacji (wstępne ładowanie danych w pamięci, otwieranie połączeń itp.) Nie mogą tam być wykonywane. –

+0

Dzięki Brian, dokładnie to, co mi się przydarzyło :( – Jordi

1

Możesz spróbować umieścić kod w swoim WebRole.cs, aby poprosić o URL z Twojej strony. Próbowałem tego i wygląda na to, że działa. Ale jest to trudny do debugowania, więc nigdy go nie zmusiłem.

Inną opcją byłoby użycie IIS Application Initialization. Nie można go używać w usługach IIS 7.5, ale można uzyskać IIS 8, jeśli uaktualnisz swoje role do systemu Windows 2012 (ustaw osfamily = "3" w pliku .cscfg).

Powiązane problemy