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 wykorzystujesz LoadControl
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 z NumRecompilesBeforeAppRestart
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:
- Skonfiguruj Klucz MachineKey (IIS7, ale nadal ma wartość 8), aby był stałą wartością
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.
- Każda konfiguracja państwo Server lub konfiguracji bazy danych do przechowywania stanu sesji .
- Przełącz się z używania
InProc
na StateServer
lub SQLServer
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.