2013-05-21 7 views
8

Właśnie zaczynam się moczyć na mokro, poznając szczegóły techniczne Azure, więc przepraszam, jeśli to głupie pytanie.Jaka jest różnica między zdarzeniem webrole onStart() a zdarzeniem Application_Start() global.asax?

Jeśli utworzę projekt usługi w chmurze w visual studio i dodasz wortal do aplikacji mvc, w aplikacji mvc mogę zobaczyć plik "WebRole.cs". Jednak gdy zaczynam od aplikacji MVC jako punktu wyjścia, a później chcę włączyć ją dla Azure, klikając prawym przyciskiem myszy na projekcie i wybierając "Dodaj projekt usługi w chmurze Windows Azure", nie jest tworzony WebRole.cs.

Więc gdzie powinienem się udać, aby wydarzenie stało się początkiem WebRole? Zdarzenie Application_Start() pliku Global.asax?

Jeśli tak, jaka jest różnica między Application_Start() w Global.asax a metodą onStart() webroles?

Znalazłem następujące stanowiska, które oferuje częściowe wyjaśnienie: What starts first Application_Start or WebRole's OnStart?

Więc jeśli jest to przypadek, że zdarzenie onStart z WebRole występuje przed Application_Start() w Global.asax, co się dzieje, jeśli Chcę uruchomić kod w zdarzeniu onStart() w projekcie, w którym później włączono aplikację dla platformy Azure?

Odpowiedz

13

Kiedy nie ma klasy rozszerzające RoleEntryPoint rolę internetową will run just fine, po prostu nie ma dodatkowy kod jest uruchamiany zamiast OnStart(), Run() i OnStop().

Application_Start() jest całkowicie niezwiązane z Azure i jest całkowicie ignorowane przez środowisko wykonawcze Azure, to tylko niektóre elementy okablowania ASP.NET. Możesz bez problemu bezwarunkowo rzucić wyjątek i to nie przeszkadza w uruchomieniu twojej roli, tylko wszystkie żądania HTTP się nie powiedzie.Należy pamiętać, że od wersji SDK 1.3 trybem domyślnym jest "tryb IIS", w którym ładunek roli internetowej zawierający potomek RoleEntryPoint działa w jednym procesie (WaIISHost.exe), a kod ASP.NET działa w innym procesie. Proces z RoleEntryPoint jest uruchamiany najpierw przez środowisko wykonawcze Azure, działa OnStart() i wchodzi w nieskończoną pętlę w Run(), a następnie otwiera się instancja dla żądań HTTP. Jeśli korzystasz z usług IIS 7.5 i masz włączoną funkcję "autostart", możesz wcześniej wykonać operację Application_Start(), ale w przeciwnym razie nie będziesz wykonywać Application_Start(), dopóki nie pojawi się pierwsze żądanie.

Kluczem jest to, że istnieją dwa różne procesy, które uruchamiają Twój kod, a każdy z nich ma swój okres istnienia i określa ograniczenia w zakresie projektowania aplikacji.

Klasa potomna RoleEntryPoint może mieć dowolną nazwę, należy do dowolnej przestrzeni nazw i znajdować się w dowolnym pliku .cs w projekcie, który jest wybrany jako ładunek dla roli internetowej - prawdopodobnie będzie to projekt ASP.NET. W tych warunkach potomek RoleEntryPoint będzie znajdować się w środowisku wykonawczym platformy Azure, a jego metody będą uruchamiane w ramach okresu istnienia instancji roli.

0

Być może nie rozumiem tutaj tego pytania, więc proszę dać mi znać, jeśli tak.

Zaczynając od zwykłego projektu ASP.NET, można później go przekonwertować, aby działał w roli sieciowej Windows Azure. WebRole.cs nie jest technicznie wymagany - rola powinna rozpocząć się bez niego. Ale jeśli chcesz wprowadzić pewną logikę jako część procesu uruchamiania instancji roli, możesz dodać klasę WebRole, dziedzicząc z RoleEntryPoint i zastąpić OnStart(). Możesz tam np. Skonfigurować diagnostykę, utworzyć tabele pamięci masowej Windows Azure lub kolejki itp.

Ogólnie rzecz biorąc, chciałbym umieścić logikę konfiguracji/bootstrap w OnStart (Web) ról sieciowych - więcej specyficznej dla platformy konfiguracji/bootstrapu.

+1

Właśnie to wymyśliłem. Czy klasa musi nazywać się "WebRole.cs" i istnieje w katalogu głównym projektu, czy może być nazywana cokolwiek i siedzieć w dowolnym miejscu, dopóki dziedziczy po RoleEntryPoint? Podejrzewam, że będzie musiał działać zgodnie z konwencją zwykłego pliku WebRole.cs webrole, aby działał poprawnie. – Steviebob

0

Możesz mieć klasę pojedynczego punktu wejścia do swojej roli odziedziczonej z klasy RoleEntryPoint. Zwykle odziedziczone są po tym workerrole.cs lub webrole.cs.

Możesz podać dowolną nazwę klasy pod warunkiem, że jest dziedziczona z RoleEntryPoint.

Zdarzenie OnStart tej klasy jest uruchamiane, gdy rola jest już gotowa. Możesz napisać swoją logikę inicjalizacji tutaj przed uruchomieniem aplikacji. Może to być inicjalizacja kontenerów IoC, konfiguracja diagnostyczna Windows Azure lub cokolwiek innego.

Zdarzenie Application_Start jest uruchamiane po pierwszym uruchomieniu witryny. Twoja rola jest już w stanie gotowości.

+0

Prawdopodobnie nie chcesz konfigurować kontenerów IoC w RoleEntryPoint - działa to w [oddzielnej domenie aplikacji do Twojej witryny] (http://azure.microsoft.com/blog/2010/12/02/new-full -iis-skills-differences-from-hosted-web-core /) (zobacz sekcję "Uzyskiwanie dostępu do statycznych członków z RoleEntryPoint i twojej strony internetowej"), więc nie można z nią porozmawiać. –

+0

Nie można również wspomnieć, że działają one w różnych procesach i domenach aplikacji. – NStuke

Powiązane problemy