Kiedyś rozwijać stron internetowych w PHP
i ASP classic
a jeśli coś trzeba było zmienić. Możesz po prostu zmienić jeden / kilka plików i nikt tak naprawdę tego nie zauważy. Być może ktoś poprosi o zmianę pliku podczas przesyłania, ale to około pół sekundy marginesu. W przypadku większości mniejszych witryn nie stanowi to problemu.
Ale najnowsze witryny są kompilowane C#
MVC
i kiedy wprowadzasz zmiany w kodzie, musisz odbudować swoją stronę i przesłać zmienione DLL
pliki. Ale kiedy zmienisz DLL
pliki, uruchomi ponownie witrynę i zresetuje wszystkie aktywne sessions
. Musi także ponownie załadować wszystko, a w przypadku dużych witryn ładowanie wszystkiego może potrwać kilka minut. Wszyscy, którzy przeglądali witrynę, zauważą i muszą się ponownie zalogować.
Główne aktualizacje witryny nie są tak częste, więc nie stanowi to problemu. Ale mamy regularne „małe” aktualizacje promocji. Jak „Wypełnij ten formularz i uzyskaj trzy miesiące bezpłatnego członkostwa” lub „Pierwsze 10, aby załadować obraz ... otrzyma cenę”. Myślę, że dostaniesz dryf. Niektóre promocje są podobne i mogą być obsługiwane za pomocą modułu, który wyświetla odpowiednie informacje na podstawie ustawień, ale dość często wymaga niestandardowego kodu.
Myślałem o systemie, w którym każda promocja jest własnym DLL
plikiem opartym na interfejsie, a następnie DLL
dynamicznie ładuję za pomocą Type.GetType
, Activator.CreateInstance
i InvokeMember
. Chociaż to może zadziałać, zastanawiam się, czy to właściwa droga.
Więc moje pytanie: jak aktualizować .NET
witrynę w locie, bez ponownego ładowania całej witryny i porzucania sesji (np. Recyklingu puli aplikacji).
źródło
Odpowiedzi:
Zajrzyj do „Inicjalizacji aplikacji” IIS 7.5, Windows 2008 R2 (trudniejsze do skonfigurowania) IIS 8, Windows 2012
Inicjalizacja aplikacji pozwala na ponowne uruchomienie dowolnej aplikacji (puli aplikacji poza witryną) i używanie starej, wciąż działającej poprzedniej aplikacji podczas rozgrzewania nowej aplikacji. Po uruchomieniu nowej aplikacji (określonej przez adresy URL, które można ustawić) zacznie ona używać nowej aplikacji i zamknie poprzednią. Korzystanie z inicjalizacji aplikacji w połączeniu z metodami zapewniającymi pozostanie sesji w restartach puli aplikacji może umożliwić bezproblemowe ponowne uruchomienie witryny. (Zhaph ma dobrą notatkę na temat klucza maszynowego.)
Oprócz powyższych łączy do konfiguracji inicjowania aplikacji, będziesz chciał sprawdzić, co powoduje ponowne uruchomienie witryny - ponieważ ponowne uruchomienie witryny nie korzysta z inicjalizacji aplikacji, ponowne uruchomienie witryny nie będzie płynne.
Możesz skonfigurować IIS, aby aktualizacja DLL nie wyzwalała natychmiastowego restartu witryny ani nie zmieniała pliku web.config (wysokie wartości ChangeNotification w httpRuntime i zewnętrznych plikach konfiguracyjnych, odpowiednio do twojej witryny).
Ostatecznym rezultatem jest to, że możesz zaktualizować biblioteki DLL / kod bez restartu witryny, a następnie wymusić restart aplikacji , który użyje rozgrzania tła AppInitialization do płynnej zmiany kodu.
Wykonanie tych rzeczy na koncercie działa całkiem dobrze, aby zapewnić bezproblemowe ponowne uruchomienie.
źródło
Istnieje wiele sposobów radzenia sobie z tym, o co prosisz, oraz kilka różnych aspektów pytania:
Obsługuj małe aktualizacje promocji
To, czego naprawdę tu szukasz, to system zarządzania treścią lub podobny, który pozwala edytować zawartość w locie (pomyśl Wordpress / Drupal lub z punktu widzenia .NET N2 CMS, Umbraco, Orchard itp.), Jednak tam są pewne rzeczy, które możesz wypróbować, jeśli nie wybrałeś tej trasy.
Ponieważ ASP.NET naprawdę ładuje się ponownie tylko po dotknięciu niektórych typów plików (web.config (s), głównie zawartości
/bin/
i/app_code/
folderów) - i ma konfigurowalny limit dla „innych zmian plików” (w zasadzie po modyfikacji wiele plików w Twojej witrynie pula aplikacji uruchomi się ponownie -NumRecompilesBeforeAppRestart
) możesz popatrzeć na coś, w którym sprawdzasz inny folder dla niektórych statycznych (tj..html
) plików, które pobierasz i wyświetlasz w razie potrzeby, lub wykorzystujeszLoadControl
metodę, która przyjmuje.ascx
kontrola użytkownika i dynamicznie ładuje go - jak określić, które na wystawie to inna kwestia bardziej nadaje się do StackOverflow - jednak polecam rozwiązanie oparte konwencji nazewnictwa.Możesz również rozważyć użycie czegoś takiego jak Managed Extensibility Framework (MEF - który jest pełną częścią frameworku .NET od wersji 4), który pozwala napisać architekturę opartą na wtyczkach i określić folder poza
/bin/
katalogiem do monitorowania nowe .DLLs - chociaż nie próbowałem tego, aby sprawdzić, czy pozwoli to uniknąć problemu z ponownym uruchomieniem aplikacji, wykorzystałem to z dobrym skutkiem w środowisku internetowym, aby dodać wspólną funkcjonalność do witryny.Jeśli to nie przemawia, jedyną inną opcją, o której mogę pomyśleć, byłoby dodanie formantów jako „kodu z przodu”, tak jak to zrobiliśmy w klasycznej ASP - tj. Z
<script runat="server">
blokiem zamiast skompilowanej klasy „za kodem” że zawiera logikę do uruchomienia sterowania - to usunie potrzebę zmiany DLL, kosztem pewnego raz pierwszy utraty wydajności, kontrola jest kompilowany w locie - znowu trzeba zrównoważyć to zNumRecompilesBeforeAppRestart
gdyby ciebie wprowadzam wiele drobnych zmian.Jak utrwalić sesje po ponownym uruchomieniu aplikacji?
Jest to prawdopodobnie łatwiejszy problem do rozwiązania i obejmuje trzy kluczowe kroki:
AutoGenerate
- oznacza to, że gdy AppPool zostanie zregenerowany, użyje tego samego klucza, dzięki czemu będzie mógł odszyfrować pliki cookie sesji, stan wyświetlania itp. recykling.InProc
naStateServer
lubSQLServer
w elemencie SessionState w pliku web.config.W ten sposób będziesz mieć trwałe sesje, które przetrwają restart aplikacji. Nie są to jednak „darmowe” - wszystko, co przechowujesz w sesji, musi być teraz możliwe do serializacji, a ty poniesiesz niewielki spadek wydajności, ponieważ każde ładowanie strony będzie wymagać dodatkowych podróży w sieci, aby uzyskać i potencjalnie zwolnić dane sesji.
Jeśli jednak jesteś w sytuacji, w której uruchomienie aplikacji trwa po „kilku minutach”, możesz rozważyć przejście na środowisko z równoważeniem obciążenia lub przynajmniej konfigurację przejściową / na żywo z możliwością wymiany podczas pracy (takich jak te dostarczone przez Azure / AWS / itp.) - w ten sposób możesz przełączyć serwer w tryb offline podczas jego aktualizacji lub przygotować go z nowym kodem, a następnie zamienić go - pod warunkiem, że wykonałeś kroki w celu rozwiązania problemu udostępnionego sesje (patrz wyżej) będzie to działać dobrze, bez wpływu na użytkowników.
źródło
CMS
nie to, czego chcę. Nie chcę zmieniać treści, chcę zmieniać kod. Część dotycząca sesji była tylko przykładem. Zmiana nie rozwiąże problemu, że witryna nie działa przez minutę lub dwie podczas ponownego ładowaniaDLL
plików. TaMEF
część była interesująca, ale jest to rozwiązanie dla systemu, o którym myślałem. Więc +1 za wysiłek, ale niestety tak naprawdę nie jest to odpowiedź na moje pytanie.