Szczerze mówiąc, próbowałem rzucić brudną sztuczkę na IIS i kiedy pomyślałem, że mi się to uda, zdałem sobie sprawę, że moje obejście nie działa. Oto, co próbowałem zrobić:
1) Mam aplikację ASP.NET, która ma klasę Preloader, która dziedziczy IProcessHostPreloadClient i wykonuje całą ciężką inicjalizację w implementacji metody Preload (aplikacja jest złożona i stanowi część ogromnego systemu, więc ustanowienie połączeń ze wszystkimi niezbędnymi elementami zajmuje około 2 minut usługi i wstępnie zarejestrować niektóre rejestracje Unity).
2) Mam dużo pracy, którą należy wykonać przy zamykaniu aplikacji (anulowanie subskrypcji, rozłączenie, usunięcie, ...), i chyba najlepszym miejscem do tego jest metoda * Application_End * znajdująca się w Global.asax .
3) Wszystko działa dobrze, gdy mam aktywność użytkownika (pierwsze żądanie po uruchomieniu puli aplikacji zawierającej wspomnianą aplikację internetową spowoduje wywołanie * Application_Start *, a następnie * Application_End * zostanie wywołane przy zatrzymaniu lub recyklingu puli aplikacji), ale problemy występuje, gdy nie ma aktywności użytkownika, a aplikacja próbuje się zrestartować po 48 godzinach aktywności (skonfigurowane wymaganie). Ponieważ nie było żadnych żądań, aplikacja oficjalnie się nie rozpoczęła. Ergo, nie można go z wdziękiem zatrzymać, ponieważ * Application_End * nie zostanie wywołane.
4) Teraz pojawia się bałagan ... Próbowałem wysłać żądanie GET z kodu na końcu metody Preload i zadziałało. Ale to rozwiązanie wydawało mi się złe, mimo że zadziałało. Próbowałem wielu rzeczy, a ostatnią rzeczą, jakiej próbowałem, było:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... i to spełniło swój cel. Wywołano * Application_Start * (sprawdziłem odpowiedź, zawierała stronę logowania, która miała być wyświetlana w początkowym żądaniu), a aplikacja zamykania puli aplikacji zakończyła się z wdziękiem wykonując niezbędną pracę w * Application_End *.
ALE
Po uruchomieniu aplikacji (wstępnie załadowanym i zainicjowanym) w ten sposób stało się to, gdy chciałem uzyskać dostęp do aplikacji za pośrednictwem przeglądarki internetowej:
Błąd HTTP 500.21 - Wewnętrzny moduł obsługi błędów serwera „ExtensionlessUrlHandler-Integrated-4.0” ma zły moduł „ManagedPipelineHandler” na liście modułów
Nie jestem w stanie tego rozgryźć. Czy ktoś może mi powiedzieć, dlaczego tak się dzieje i jak to naprawić?
Jeśli tego nie rozwiążę, wrócę do pierwszego rozwiązania (wysyłanie żądania GET z kodu), ale ten problem mnie popsunie, ponieważ nawet nie mam pojęcia, co jest nie tak.
źródło
Odpowiedzi:
Problem
Korzystasz z SimpleWorkerRequest w scenariuszu, dla którego nie został zaprojektowany. Używasz go w IIS . Jeśli spojrzysz na poprzedni link MSDN (nacisk jest mój):
Ponadto, jeśli spojrzysz na dokumentację MSDN dla przestrzeni nazw System.Web.Hosting (
SimpleWorkerRequest
znajduje się w tej przestrzeni nazw), zobaczysz również coś podobnego do powyższego (ponownie nacisk jest mój):Rozwiązanie
Polecam usunięcie połączenia z
SimpleWorkerRequest
. Zamiast tego możesz użyć rozwiązania Microsoft, aby upewnić się, że Twoja strona internetowa uruchomi się automatycznie po ponownym uruchomieniu. Potrzebny jest moduł inicjowania aplikacji Microsoft dla IIS 7.5 . Konfiguracja nie jest skomplikowana, ale musisz zrozumieć dokładne opcje. Dlatego też poleciłbym również interfejs użytkownika inicjalizacji aplikacji dla IIS 7.5 . Interfejs użytkownika został napisany przez blogera MSDN.Co dokładnie robi rozwiązanie Microsoft? Robi to, co próbujesz zrobić - IIS wysyła żądanie „get” do Twojej witryny po uruchomieniu puli aplikacji.
źródło
Spróbuj ponownie zarejestrować ASP.NET w
aspnet_regiis -i
. To zadziałało dla mnie.Prawdopodobna ścieżka do .NET 4 (z wiersza polecenia z podwyższonym poziomem uprawnień):
http://forums.iis.net/p/1190643/2026401.aspx
źródło
Jeśli napotykasz ten błąd w systemach Windows 8 / Windows Server 2012 i .Net 4.5, postępuj zgodnie z tymi instrukcjami tutaj: http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html
Przejdź do „włączania lub wyłączania funkcji systemu Windows”, a następnie Internetowych usług informacyjnych, następnie usług WWW, następnie funkcji programowania aplikacji, a następnie włącz ASP.NET 4.5
To zadziałało dla mnie (chociaż kreator i sformułowania są nieco inne w systemie Windows Server 2012, ale zrozumiesz to). Biorąc to pod uwagę, dlaczego jest to konieczne po zainstalowaniu wszystkiego za pośrednictwem Instalatora platformy internetowej, w tym wszystkich zależności, jest całkowicie poza mną ...
źródło
Pomimo przestrzegania większości porad na tej stronie wciąż miałem problemy z systemem Windows Server 2012. Zainstalowanie .NET Extensibility 4.5 rozwiązało to dla mnie:
Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5
źródło
W systemie Windows 10 / Windows Server 2016 użyj następującego polecenia:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all
Sugerowane odpowiedzi
aspnet_regiis
nie działają w systemie Windows 10 (Creators Update i nowszym) lub Windows Server 2016:Co ciekawe, okno dialogowe „Włączanie / wyłączanie funkcji systemu Windows” nie pozwoliło mi odznaczyć programów .NET ani ASP.NET 4.6 i działało tylko powyższe polecenie DISM. Nie jestem pewien, czy featurename jest poprawna, ale pracował dla mnie.
źródło
Uruchom jedno z następujących poleceń:
W 32-bitowym systemie operacyjnym Windows:
W 64-bitowym systemie operacyjnym Windows:
źródło
Ten https://stackoverflow.com/a/13266763/1277458 działa idealnie. Ale jeśli masz 64-bitowy system operacyjny, użyj Framework64 zamiast Framework w ścieżce:
źródło
W moim przypadku (Windows 10 + IIS 10) musiałem otworzyć „ Włącz lub wyłącz funkcje systemu Windows ”, a następnie przejdź do Internetowych usług informacyjnych> Usługi WWW> Funkcje rozwoju aplikacji> i sprawdź ASP.NET 4.6
źródło
Robienie tego własnego posta, bo to działało przez wiele godzin.
Widziałem może kilkanaście podobnych postów tutaj i gdzie indziej na temat tego problemu i poprawki aspnet_regiis. Nie działały dla mnie, a aspnet_regiis zachowywał się dziwnie, tylko wyświetlał opcje itp.
Jak wskazano powyżej użytkownik Ryan-Anderson, nie można wprowadzić .exe
Dla tych, którzy są mniej wygodni w pracy poza IIS na serwerze, oto co robisz w prostych krokach.
Znajdź aspnet_regiis w folderze podobnym do tej ścieżki. c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \
Kliknij prawym przyciskiem myszy wiersz polecenia w menu Start lub w dowolnym miejscu i każ mu uruchomić się jako administrator. Korzystanie z funkcji „Uruchom” systemu Windows po prostu nie działa lub dla mnie nie działało.
Wróć do pliku wykonywalnego aspnet_regiis. Kliknij i przeciągnij go bezpośrednio do wiersza polecenia lub skopiuj i wklej adres w wierszu polecenia.
Usuń, jeśli jest, plik .exe na końcu. To jest klucz. Na końcu dodaj -i (spacja minus oko). Wchodzić.
Jeśli zrobiłeś to poprawnie, zobaczysz, że zaczyna instalować asp.net, a następnie powie ci, że się udało.
źródło
Upewnij się, że ustawiłeś
application-site
wersję odv2.0
dov4.0
w Menedżerze IIS :Następnie zainstaluj swój
ASP.NET
.W przypadku 32-bitowego systemu operacyjnego (Windows):
W przypadku 64-bitowego systemu operacyjnego (Windows):
Uruchom ponownie
application-site
w IIS Manager i ciesz się.źródło
Wiem, że to jest staruszek, ale pomyślałem, że mogę wnieść jakąś wartość. Jeśli korzystasz z Server Core poza domeną (członkowie domeny mogą po prostu uruchomić Menedżera serwera zdalnie, aby dodać / usunąć funkcje / role), musisz skorzystać z wiersza poleceń.
Użytkownicy programu PowerShell mogą wpisać „Install-WindowsFeature Web-Asp-Net45”
Powinno to być równoważne z użyciem menedżera serwera.
źródło
Wystąpił problem z tym samym komunikatem o błędzie przy zainstalowanym programie .net 4.7.
Rozwiązaniem było pójście za jednym z wcześniej wspomnianych postów, aby przejść do „Włączania lub wyłączania funkcji systemu Windows”, w której zaznaczono już „Zaawansowane usługi .NET Framework 4.7” -> „ASP.NET 4.7”.
W dalszej części listy znajdują się „Internetowe usługi informacyjne” i przypis „Funkcje tworzenia aplikacji” -> „ASP.NET 4.7”, który również należy sprawdzić.
Po włączeniu tej opcji włączono wiele innych funkcji ... Po prostu nacisnąłem przycisk OK i problem został rozwiązany. Screendump okna dialogowego funkcji systemu Windows
źródło
Pracuję nad systemem Windows Server 2012. Funkcja rozszerzenia .NET 4.5 jest włączona. Moduł WebDAV został usunięty. Wciąż otrzymywałem błąd 500.21 na trasie / dokumentach ASP.NET.
Zmiana „skipManagedModules” na false rozwiązała problem.
Dzięki https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI
źródło
Rozwiązałem ten problem, dodając „Włączanie lub wyłączanie funkcji systemu Windows” Opcja ASP.NET 4.7
źródło
Miałem ten problem i stwierdziłem, że usunięcie następującego folderu pomogło, nawet w przypadku edycji innej niż Express.
C:\Users\<user>\Documents\IISExpress
źródło
Ten błąd zaczął mi się pojawiać znikąd w zeszłym tygodniu, wpływając na istniejące strony internetowe na moim komputerze. Nie miałem szczęścia wypróbować żadnej z sugestii tutaj. W końcu całkowicie usunąłem WebDAV z IIS (Funkcje systemu Windows -> Internetowe usługi informacyjne -> Internetowe usługi sieciowe -> Wspólne funkcje HTTP -> Publikowanie WebDAV). Zrobiłem reset IIS po tym dla dobrego pomiaru, a mój błąd został w końcu rozwiązany.
Mogę tylko zgadywać, że aktualizacja systemu Windows spowodowała problem, ale nie jestem pewien.
źródło
Można to naprawić, zmieniając typ „ExtensionlessUrlHandler-Integrated-4.0” w systemie iis na System.Web.DefaultHttpHandler
źródło
Dla mnie usunięcie WebDAV z mojego serwera spowodowało, że aplikacja zwróciła
503 Service Unavailable
komunikat o błędzie podczas używaniaPUT
lubDELETE
, więc ponownie go zainstalowałem. Próbowałem także całkowicie usunąć .NET Framework 4.5 i ponownie go zainstalować, a także próbowałem ponownej rejestracji zgodnie z sugestią, ale bezskutecznie.Byłem w stanie to naprawić, wyłączając WebDAV dla indywidualnej puli aplikacji, co zatrzymało błąd „złego modułu” podczas używania
PUT
lubDELETE
.Wyłącz WebDAV dla indywidualnej puli aplikacji:
WebDAV Authoring Tools
na liścieDisable WebDAV
w prawym górnym rogu.Ta daaaa!
Nadal pozostawiłem usunięte elementy w moim
web.config
pliku.Ten link zawiera instrukcje, ale nie jest zbyt jasny.
źródło
To może nie jest przydatne rozwiązanie dla OP, ale dotyczy tego samego komunikatu o błędzie.
Hostujemy strony PHP na IIS8.5 z poprawnie zainstalowanym programem .NET 4.5.
Korzystamy z funkcji wstępnego ładowania, aby mieć pewność, że nasza aplikacja zawsze reaguje na wszystkie pytania.
Po pewnym czasie zaczęliśmy losowo otrzymywać ten błąd.
W pliku web.config: ustawiłem skipManagedModules na true, -> nie rób tego!
Chociaż strona internetowa to php, routing do stronicowania jest zarządzany przez moduły !!!
źródło
Wpadłem również na ten problem. Moja aplikacja MVC4 działa na systemie Windows Server 2012 R2 z IIS 8.5. Żadne z tych opublikowanych rozwiązań nie działało dla mnie ... instalacja brakujących platform za pomocą IIS Funkcje mogła rozwiązać problem, ale instalacja zawsze kończyła się niepowodzeniem.
Musiałem użyć
Web Platform Installer
i zainstalować następujące pakiety:źródło
Napotkałem ten problem w aplikacji internetowej hostowanej na współdzielonym serwerze hostingowym. Oczywiście nie miał bezpośredniego dostępu do IIS, więc nie mógł zastosować wielu proponowanych tutaj rozwiązań.
W panelu sterowania dostawcy hostingu włączyłem rejestrowanie błędów dla IIS i ASP.Net. A potem dowiedziałem się, że błąd faktycznie leżał w brakującym pliku cshtml.
źródło
Instalacja .NET 4.7 działała dla mnie. Wcześniej zainstalowałem tylko 3.5.
źródło