Es gibt verschiedene Möglichkeiten, mit Ihren Fragen umzugehen, und einige unterschiedliche Aspekte Ihrer Frage:
Behandeln Sie kleine Updates für Werbeaktionen
Was Sie hier wirklich suchen, ist ein Content-Management-System oder ähnliches, mit dem Sie den Inhalt im Handumdrehen bearbeiten können (beispielsweise Wordpress / Drupal oder aus .NET-Sicht N2 CMS, Umbraco, Orchard usw.) Es gibt einige Dinge, die Sie ausprobieren könnten, wenn Sie diesen Weg nicht gegangen sind.
Da ASP.NET nur dann wirklich neu geladen wird, wenn Sie bestimmte Dateitypen (web.config (s), hauptsächlich den Inhalt der /bin/
und /app_code/
Ordner) berühren - und ein konfigurierbares Limit für "andere Dateiänderungen" hat (im Grunde genommen, wenn Sie dies geändert haben) Bei vielen Dateien auf Ihrer Site wird der Anwendungspool neu gestartet. - NumRecompilesBeforeAppRestart
) Sie könnten versuchen, einen anderen Ordner nach statischen (dh .html
) Dateien zu durchsuchen, die Sie nach Bedarf abrufen und anzeigen, oder die LoadControl
Methode verwenden, die einen Zeichenfolgenpfad verwendet ein .ascx
Benutzersteuerelement und lädt es dynamisch - wie Sie bestimmen, welches angezeigt werden soll, ist eine andere Frage, die besser für StackOverflow geeignet ist - ich würde jedoch eine auf Namenskonventionen basierende Lösung empfehlen.
Sie können auch das Managed Extensibility Framework (MEF) verwenden, das seit Version 4 Bestandteil des .NET-Frameworks ist und es Ihnen ermöglicht, eine Plug-in-basierte Architektur zu schreiben und einen Ordner außerhalb Ihres /bin/
Verzeichnisses anzugeben, auf den überwacht werden soll neue .DLLs - obwohl ich nicht versucht habe, das Problem mit dem Neustart der App zu vermeiden, habe ich dies in einer Webumgebung mit gutem Erfolg genutzt, um einer Site allgemeine Funktionen hinzuzufügen.
Wenn das nicht gefällt, ist die einzige andere Option, die ich mir vorstellen kann, die Steuerelemente als "Code-in-Front" hinzuzufügen, wie wir es in klassischem ASP getan haben - dh mit einem <script runat="server">
Block anstelle einer kompilierten "Code-behind" -Klasse Das Steuerelement enthält die Logik zum Ausführen des Steuerelements. Dadurch wird die Notwendigkeit einer DLL-Änderung auf Kosten eines erstmaligen Leistungsverlusts beseitigt, da das Steuerelement im laufenden Betrieb kompiliert wird. Sie müssen dies wiederum mit NumRecompilesBeforeAppRestart
if you abwägen mache viele kleine Änderungen.
Wie kann ich Sitzungen über App-Neustarts hinweg beibehalten?
Dies ist möglicherweise einfacher zu lösen und umfasst drei wichtige Schritte:
- Konfigurieren Sie den MachineKey (IIS7, gilt jedoch weiterhin für 8) als konstanten Wert, anstatt
AutoGenerate
- dies bedeutet, dass der AppPool beim Recyceln denselben Schlüssel verwendet und daher Sitzungscookies, ViewState usw. von früher entschlüsseln kann das recyceln.
- Richten Sie entweder einen Statusserver ein oder konfigurieren Sie eine Datenbank für den Sitzungsstatus .
- Wechseln Sie von der Verwendung
InProc
zu StateServer
oder SQLServer
in das SessionState-Element in Ihrer web.config.
Auf diese Weise haben Sie dauerhafte Sitzungen, die einen Neustart der App überstehen. Diese sind jedoch nicht "kostenlos" - alles, was Sie in der Sitzung speichern, muss jetzt serialisierbar sein, und Sie werden einen leichten Leistungseinbruch erleiden, da für das Laden jeder Seite zusätzliche Netzwerk-Trips erforderlich sind, um die Sitzungsdaten abzurufen und möglicherweise freizugeben.
Wenn Sie sich jedoch in einer Situation befinden, in der der Neustart der Anwendung nach einer Bereitstellung einige Minuten in Anspruch nimmt, sollten Sie in Betracht ziehen, auf eine Umgebung mit Lastenausgleich oder zumindest eine Hot-Swap-fähige Staging / Live-Einrichtung zu wechseln (wie das von Azure / AWS / etc. bereitgestellte) - Auf diese Weise können Sie einen Server offline schalten, während Sie ihn aktualisieren, oder ihn mit dem neuen Code vorbereiten und dann austauschen - vorausgesetzt, Sie haben die Schritte zur Adressfreigabe ausgeführt Sitzungen (siehe oben) Dies funktioniert einwandfrei und hat keine Auswirkungen auf Ihre Benutzer.