Application_Start się nie uruchamia?

143

Mam aplikację ASP.NET MVC (beta), nad którą pracuję, i mam problem z ustaleniem, czy robię coś źle, lub czy moja Application_Startmetoda w Global.asax.cs w rzeczywistości nie uruchamia się, gdy próbuję do debugowania aplikacji.

Umieściłem punkt przerwania w wierszu mojej Application_Startmetody i spodziewam się, że gdy próbuję debugować aplikację, punkt przerwania powinien zostać trafiony ... ale nigdy tak się nie dzieje. Nie po zresetowaniu usług IIS, ani po ponownym uruchomieniu, nigdy. Czy coś mi brakuje? Dlaczego ta metoda nigdy nie jest wywoływana?

Bob Yexley
źródło
Czy Twoja strona global.asax dziedziczy z klasy globalnej, w której znajduje się Twoja metoda?
Wpadłem na przypadek, w którym po global.asaxprostu brakowało pliku. więc to też warto sprawdzić :-)
itsho

Odpowiedzi:

85

Jeśli jest to w usługach IIS, aplikację można uruchomić przed dołączeniem debugera. Jeśli tak, nie jestem pewien, czy możesz spać wystarczająco długo, aby się przywiązać.

W programie Visual Studio można dołączyć debuger do procesu. W tym celu kliknij Debuguj >> Dołącz do procesu. Podłącz do przeglądarki, a następnie naciśnij swoją aplikację. Aby być bezpiecznym, uruchom ponownie IIS i wejdź na stronę. Nie jestem w 100% przekonany, że to rozwiąże problem, ale zrobi to znacznie lepiej niż odpalenie snu wątku w App_Start.

Inną opcją jest tymczasowe hostowanie na wbudowanym serwerze internetowym do czasu zakończenia debugowania uruchamiania aplikacji.

Gregory A Beamer
źródło
21
aby rozwinąć - (w VS2010, przy użyciu typu projektu MVC 3) kliknij prawym przyciskiem myszy projekt sieci Web> właściwości> sieć (karta) i upewnij się, że wybrano opcję „Użyj programu Visual Studio Development Server”. Następnie punkty przerwania Application_Start powinny zostać dobrze trafione.
MemeDeveloper,
Dzięki @MemoDeveloper !! To jest wspaniałe !!
Praveen Prajapati
2
Ahhhhhh mannnnnnn, straciłem kilka godzin. Jeszcze raz!! Dzięki za tę odpowiedź. :)
Samuel
Jeśli ustawisz punkt przerwania w programie Visual Studio w Global.asax.cs w Application_Start () i nie zostanie on uruchomiony, sprawdź typ kompilacji. Jeśli używasz wersji, ten punkt przerwania może się nie uruchomić. Przełącz się na debugowanie i powinno się zatrzymać.
Paweł
171

Uwaga: przyjemną i łatwą alternatywą dla korzystania z wbudowanego „Visual Studio Development Server” lub IIS Express (np. Ponieważ tworzysz w oparciu o IIS i masz określone ustawienia potrzebne do prawidłowego funkcjonowania aplikacji) jest po prostu kontynuowanie działania w usługach IIS (I użyj niestandardowego serwera sieci Web + wpis pliku hostów + powiązanie usług IIS z tą samą domeną)

  1. poczekaj, aż sesja debugowania się uruchomi
  2. następnie po prostu dokonaj edycji spacji w katalogu głównym web.config i zapisz plik
  3. odśwież stronę (Ctrl + F5)

Twój punkt przerwania powinien zostać dobrze trafiony i możesz kontynuować debugowanie w swoim naturalnym środowisku IIS . Świetny !

MemeDeveloper
źródło
To jest genialne podłączenie do recyklingu AppDomain. Dzięki !!
Sanjay 10
Nie ma już serwera Visual Studio Development Server. stackoverflow.com/questions/19676527/…
mac10688
1
@ mac10688 prawda, ale nadal istnieje „IIS Express”, który zasadniczo nie jest środowiskiem produkcyjnym. Zaktualizowałem odpowiednio odpowiedź dzięki.
MemeDeveloper
Zdecydowanie przyjęta odpowiedź. Kieruję do moich usług IIS urządzenia, które nie pozwalają na komunikację podczas korzystania z wersji IIS Express! To zadziałało czarująco.
Matt Skeldon
54

Poniższe wskazówki pomagają w każdym przypadku (bez względu na to, czy używasz IIS, Cassini czy cokolwiek innego):

  1. Ustaw punkt przerwania w Application_Start
  2. Rozpocznij debugowanie (punkt przerwania najprawdopodobniej nie jest trafiony) -> strona jest wyświetlana w przeglądarce
  3. Zmień plik web.config (np. Wprowadź pusty wiersz) i zapisz go
  4. Załaduj ponownie stronę w przeglądarce -> punkt przerwania został trafiony!

Dlaczego to działa? Po zmianie pliku web.config serwer sieciowy (IIS, Cassini itp.) Wykonuje recykling, ale w tym przypadku (z dowolnego powodu) proces pozostaje taki sam, więc pozostajesz z nim połączony za pomocą debugera (Visual Studio ).

Jochen Scharr
źródło
3
Klon, dwa lata później stackoverflow.com/a/7655582/11635 - rozważ usunięcie i umieszczenie dodatkowych informacji w komentarzu
Ruben Bartelink
właściwie @RubenBartelink, myślę, że ta odpowiedź jest jaśniejsza niż druga, ze względu na sformułowanie i dodatkowe wyjaśnienia.
Heriberto Lugo
1
@HeribertoLugo Nie przeszkadza mi to - z 50 pozytywnymi opiniami trudno się całkowicie nie zgodzić (niemniej jednak byłbym zachwycony zmianą drugiej odpowiedzi, aby wypełnić lukę, jeśli ktoś ma czas i kontekst; minęło trochę czasu, odkąd ja ' użyliśmy debuggera w IIS!)
Ruben Bartelink
zgadzam się edytować drugą i usunięcie tej byłoby lepszą trasą .. najpierw zobaczyłem drugą i podążyłem za nią, więc to nie zadziałało .. kiedy zobaczyłem tę po spędzeniu na niej pół godziny, to zrobiło więcej sensu… to pół godziny nie musiałem przegrać…
Heriberto Lugo
22

Ja też mam problemy z punktami przerwania w application_start z usługami IIS hostowanej aplikacji. Dobrym rozwiązaniem jest użycie Debugger.Break (); w kodzie zamiast punktu przerwania VS

Flores
źródło
2
Wierzę, że nie trafienie w punkt przerwania jest związane z uruchomieniem puli aplikacji w trybie zintegrowanego potoku. Używasz tego?
Flores,
9

Mam ten sam problem. W moim rozwiązaniu dokonałem wielu zmian nazwy. Po tym dostałem dwie niedziałające aplikacje internetowe i kilka innych aplikacji internetowych było w porządku. Pojawił się błąd, że mam złe trasy. Kiedy próbowałem ustawić punkt przerwania w Application_Startmetodzie, a następnie ponownie uruchomić usługi IIS, VS nie przerwał wykonywania. Z działającymi aplikacjami internetowymi działała przerwa. Następnie przypomniałem sobie, że „czyste rozwiązanie” i „przebudowa” nie usuwa zestawów, które pozostały po zmianie nazwy. I to było rozwiązanie! Ręcznie wyczyściłem binkatalogi moich błędnych aplikacji internetowych, a następnie zobaczyłem nowy błąd w Global.asax Inherits=""atrybucie odwołującym się do starej biblioteki dll. Zmieniłem go na nowy i przerwa zaczęła działać. Załóżmy, że podczas zmiany nazwy Global.asax nie został zaktualizowany,

Dao
źródło
Wow, to było trudne do znalezienia! To na wskazówkę!
Landon Poch,
@Etti Naprawdę super, dziękuję;) Zmarnowałem na to kilka godzin, powinienem był znaleźć odpowiedź wcześniej :)
Pankaj Parkar
7

Mieliśmy ten sam problem w projekcie, który przejęliśmy po zbudowaniu go przez innego dostawcę. Problem polegał na tym, że chociaż było wiele poleceń napisanych przez poprzedniego sprzedawcę w Global.asax.cs, co mogło prowadzić do przekonania, że ​​jest używane, w rzeczywistości zostało całkowicie zignorowane. Global.asax nie dziedziczy po nim i łatwo jest nigdy nie zobaczyć tego pliku, jeśli istnieje plik .cs - musisz kliknąć prawym przyciskiem myszy Global.asax i kliknąć Wyświetl znaczniki, aby go zobaczyć.

Global.asax:

<%@ Application Language="C#" %>

Wymagane zmiany na:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

Gdzie ProjectNamespace jest przestrzenią nazw Twojej klasy Global.asax.cs (zwykle jest to nazwa Twojego projektu).

W naszym przypadku plik zawierał kilka wbudowanych kodów, z których część została skopiowana i wklejona z pliku .cs, a część nie. Właśnie zrzuciliśmy kod wbudowany do pliku .cs i stopniowo scaliliśmy z powrotem nasze zmiany.

Chris Moschini
źródło
To było to. Dodałem wyjątek do uruchamiania aplikacji (zgodnie z odpowiedzią Prisoner ZERO) i w ogóle nie strzelał, więc nie ma to nic wspólnego z debugerem. Zaktualizowanie znaczników Global.asax naprawiło ten problem.
Patrick Borkowicz
5

Spróbuj zmienić tryb zarządzanego potoku dla puli aplikacji na „Klasyczny” zamiast „Zintegrowany”. To rozwiązało problem. Patrząc teraz na przyczynę ...

(Rekwizyty za tę odpowiedź należą do Floresa (zobacz jego komentarz do jego własnej odpowiedzi), chciałem tylko podać to jako oddzielną odpowiedź, aby zwrócić na nią więcej uwagi)

acezanne
źródło
Tak to działa. Ale jeśli przyjmiesz, że Twoja aplikacja powinna działać w zintegrowanej puli aplikacji, powinna być również debugowana w zintegrowanej puli.
Karel Kral
Moja aplikacja również nie osiągała punktów przerwania po naciśnięciu klawisza F5, gdy przełączałem się z klasycznego na zintegrowany. Czy kiedykolwiek odkryłeś, dlaczego? Nie mam żadnych wymagań, aby używać Integrated, ale zniechęcające jest, gdy te rzeczy nie działają bez wytłumaczalnego powodu.
CodexArcanum
5

Upewnij się, że plik global.asax nie znajduje się w podkatalogu. Musi być umieszczony na poziomie głównym projektu.

Jaskiniowiec
źródło
Dziękuję bardzo!!! Uratowałeś mnie od szaleństwa! To właśnie było przyczyną mojego problemu.
Yann Duran
1
Mój problem polegał na tym, że właśnie utworzyłem klasę o nazwie Global.asax.csi spodziewałem się, że zadziała. Musisz go utworzyć za pomocą Add-> New Item->, Global Application Classaby został utworzony z odpowiednim Global.asaxplikiem konfiguracyjnym formularzy internetowych.
Levi Fuller,
4

Mieliśmy podobny problem, gdzie global.asax.cs był ignorowany.

Okazuje się, że witryna została uaktualniona z prekompilowanej witryny .NET 2 do witryny .NET 4.0. Na serwerze PrecompiledApp.configplik nie został usunięty z folderu głównego. Po usunięciu go i ponownym przetworzeniu puli aplikacji IIS i dotknięciu pliku web.config w celu ponownego uruchomienia aplikacji kod w Global.asax.cs zaczął działać poprawnie.

Glen Little
źródło
3

Kiedyś miałem problem, w którym pliki Global.asax i Global.asax.cs nie zostały w rzeczywistości skopiowane do folderu IIS przez skrypty wdrażania ... Więc zadziałało podczas debugowania na serwerze deweloperskim, ale nie w usługach IIS.

Michael Angel
źródło
Miałem ten sam problem. po wgraniu Global.asax na serwer problem rozwiązany.
Moslem Hady
3

Późny wpis ...

Aby sprawdzić, czy aplikacja IIS została uruchomiona, zanim debugger miał wystarczająco dużo czasu na dołączenie, po prostu dodaj to na górze lub na dole pliku GLOBAL.ASAX Application_Start.

throw new ApplicationException("Yup, it fired");
Więzień ZERO
źródło
2

Kiedy mówisz „debugowanie”, masz na myśli faktyczne uruchamianie aplikacji z wbudowanego serwera internetowego programu Visual Studio w celu debugowania, czy też masz na myśli dołączenie do procesu w usługach IIS? Jeśli jest to pierwsza, powinieneś nacisnąć Application_Start, ale jeśli to druga, może być trudno być na procesie wystarczająco wcześnie, aby go złapać.

Rex M
źródło
Dobrze, mam na myśli uruchomienie aplikacji z VS. Mam go w usługach IIS, więc VS dołącza do tego procesu. Czy chcesz powiedzieć, że zdarzenie jest uruchamiane wcześniej, zanim VS będzie mogło dołączyć do procesu?
Bob Yexley,
2

Zamknij program Visual Studio i usuń foldery bini objw projekcie sieci Web (lub wszystkie projekty w rozwiązaniu).

Oto polecenia umożliwiające usunięcie tych folderów ze wszystkich projektów:

rm *\bin -r
rm *\obj -r
zapasowe bajty
źródło
2

Wprowadziłem kilka zmian w oparciu o „Code Analysis on Build” z Visual Studio. Analiza kodu zasugerowała „CA1822 Oznacz członków jako statyczne” dla Application_Start () w Global.asax. Zrobiłem to i skończyłem z tym problemem.

Proponuję pominąć ten komunikat analizy kodu i nie zmieniać sygnatury metod / klas automatycznie tworzonych przez platformę używaną do ładowania aplikacji. Podpis metody Application_Start prawdopodobnie nie był statyczny z jakiegoś powodu.

Wróciłem do tej sygnatury metody i ponownie uruchomiła się Application_Start ():

    protected void Application_Start()
    { ... }
toralux
źródło
2

Napotkałem ten problem, używając strony statycznej (np. Index.html) jako strony startowej - Application-Start nie jest wywoływany. Odkryłem, że obsługa statycznej strony w rzeczywistości nie uruchamia aplikacji. Żądanie strony .aspx tak.

Panie Cook
źródło
To właśnie zrobiło to dla mnie. Dzięki.
reekeecast
2

Upewnij się, że przestrzenie nazw w Global.asax i Global.asax.cs są takie same. Jeśli są różne, nie zgłosi żadnego błędu, ale nie trafi w punkt przerwania, również dlatego, że w ogóle nie wykonuje application_start.

Irfan
źródło
1

Myślę, że zdarzenie startowe aplikacji jest uruchamiane dopiero po wysłaniu pierwszego żądania, czy trafiasz na swoją witrynę (tj. Wysyłasz żądanie)?

ninj
źródło
Tak, kieruję prośbę do aplikacji.
Bob Yexley,
1

Miałem ten problem w projekcie formularzy internetowych .net 4 vs2010 i wypróbowałem wszystko, o czym mowa na tej stronie. Skończyło się na usunięciu i dodaniu global.asax faktycznie rozwiązało problem.

Wonster
źródło
1

Mam ten sam problem, nie mogę złapać Application_Start. Powodem było to, że nie uruchamiał błędu w pliku znaczników. Plik znaczników Global.asax dziedziczył inną klasę ...

lobiZoli
źródło
1

Czy sprawdziłeś ustawienia projektu? Miałem ten problem i miałem URL początkowy prowadzący do innego portu niż port specyficzny dla mojego serwera. Zajęło mi to zbyt dużo czasu, zanim zrozumiałem ...

D. Kermott
źródło
1

Po wypróbowaniu tylu innych odpowiedzi, które miały zastosowanie w mojej sytuacji i nie miałem szczęścia z żadną z nich, przeszedłem do właściwości projektu internetowego (projekt po stronie serwera dla aplikacji Silverlight korzystającej z usług RIA), kliknąłem Karta „Sieć” i zmieniono wybrany serwer z „Lokalne IIS” na „IIS Express”. (Uwaga, używam VS2013.) To rozwiązało problem. Application_Start jest wykonywany w „IIS Express”, ale nie w „Local IIS”. Ciekawy...

MylesRip
źródło
Jest wykonywany. Po prostu nie możesz go debugować, ponieważ albo nie zostałeś dołączony do procesu IIS, albo zostałeś do niego podłączony po wykonaniu.
uygar.raf
1

Próbowałem przejść przez kod w RegisterRoutes () wywołany z uruchomienia aplikacji i nie trafiając w mój punkt przerwania. Ustaliłem, że nie wywoływano Application_Start. Musiałem dokonać zmiany, aby dokonać powierzchownej zmiany w App_start / RouteConfig.cs i zapisać ją, zanim zostanie wywołana Application_Start. Wydaje mi się, że te pliki są gdzieś buforowane i nie są wywoływane, chyba że zostanie wprowadzona zmiana.

Don Dillard
źródło
1

Mój ten sam problem został rozwiązany przez dodanie odwołania do System.Web.Routingzestawu w projekcie

wprowadź opis obrazu tutaj

Prakash Mhasavekar
źródło
0

Jeśli używasz System.Diagnostics.Debugger.Break (); obejście (które moim zdaniem jest dobre do tymczasowego użytku) i „po prostu nie działa” na komputerze z systemem Windows 8. Przyczyną jest błąd w programie Visual Studio „Debugowanie na czas”.

Rozwiązanie jest następujące, aby naprawić klucz dla „Visual Studio Just-In-Time Debugger”

Otwórz regedit i przejdź do HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} dla wartości rejestru „AppIDFlags”, ustaw flagę na 0x8

Więcej informacji tutaj: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-attempted-is-not-supported

ProVega
źródło
0

W moim przypadku zabicie wbudowanej instancji ASP.NET Development Server za pośrednictwem paska zadań rozwiązało problem.

Maciej
źródło
0

Dziwne i szalone rzeczy ... ale debugowanie na maszynie serwera i inny użytkownik zostawił IIS Express działający w swojej sesji. Musiałem wylogować się z tego użytkownika, aby zabić jego uruchomione procesy IIS Express. Wydaje się, że to rozwiązało problem!

Aktualizacja

Po spędzeniu ponad godziny na pogoni za tym, co powoduje problem ... oto oferta: w pewnym sensie udało mi się wpisać swewnątrz <appSettings>sekcji Web.config. Visual Studio próbował ostrzec mnie w Error Listoknie z ostrzeżeniem . Wyznaję, że rzadko sprawdzam ostrzeżenia ... powinienem zacząć to sprawdzać od teraz. : D Jak tylko usunąłem naruszający spunkt, punkt przerwania został trafiony Application_Start.

wprowadź opis obrazu tutaj

Leniel Maccaferri
źródło
0

Miałem ten problem podczas próby inicjalizacji log4net. Postanowiłem po prostu stworzyć statyczny konstruktor dla Global.asax

static Global(){
//Do your initialization here statically
}
Mark Procopio
źródło
0

Problem występuje głównie podczas próby przeniesienia pliku Global.asax do innego katalogu rozwiązania. Ponownie przenieś plik Global.asax do domyślnej lokalizacji. Będzie działać zgodnie z oczekiwaniami.

Arnab Chaudhuri
źródło
Co się stanie, jeśli wszystko w witrynie jest wstępnie skompilowane, w tym Global.asax.aspx? Mam wstępnie skompilowane pliki w katalogu bin. Application_Start nie jest uruchamiany.
Vin Shahrdar
0

Żadne z opisanych powyżej rozwiązań nie zadziałało. Jednak ponowna instalacja pakietu

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

Korzystanie z nuget gui jest (niezbyt przyjemnym) obejściem

Michele
źródło