2009-07-17 4 views
5

Hat jemand ein Beispiel dafür, wie man eine laufende asp.net App patchen kann? Das Szenario, das ich mir vorstelle, ist, dass die App für neuere Versionen nach einem bekannten zentralen Server suchen könnte. Laden Sie die neueren Dateien an einen temporären Speicherort herunter, und patchen Sie dann selbst.Wie man dynamisch eine laufende ASP.NET-Anwendung ausbessert?

Die Probleme, die ich sehen kann, sind, dass alle Dateiänderungen vom Dateibeobachter aufgenommen werden und die App-Domäne neu laden, die den aktuellen Patch-Prozess stoppen würde. Ich denke, dass jede geschriebene Datei ein erneutes Laden der App auslösen würde.

+0

der 'monkeypatching' Tag nicht geeignet ist - das ist etwas ganz anderes –

+0

Danke. Es versehentlich angeklickt. Gemeint ist "patchen" –

Antwort

3

Sofern Sie nicht bestimmte Dateien auf bestimmte Dateien überwachen, können Sie vorhandene ASPX-Dateien ohne Verlangsamung der Anwendung aktualisieren. Wenn der Benutzer das nächste Mal den Browser aktualisiert, wird die Aktualisierung der Seite angezeigt. Seien Sie jedoch vorsichtig, wenn Sie der Seite zusätzliche Serversteuerelemente hinzugefügt haben und die DLL noch nicht aktualisiert wurde, treten Probleme auf.

Wenn Sie die web.config- oder DLL-Dateien für die Anwendung aktualisieren, löst dies einen Neuladevorgang des ASPNET-Workerprozesses aus, und neue Benutzer erleiden die "erste Verzögerung", die Sie normalerweise erwarten können.

Wenn Sie diesen Prozess besorgt sind, und kann ein bisschen „down time“ leisten, ich würde vorschlagen, dass Sie ein Skript erstellen, die die folgenden:

  1. Laden Sie eine Datei namens app_offline.htm zu die Wurzel der Webanwendung. IIS wird diese Datei sofort sehen und Benutzer dorthin umleiten und keine .NET-Verarbeitung vornehmen. Sie können sogar eine Datei mit dem Namen App_Offline_Disabled.htm im Stammverzeichnis behalten und sie einfach umbenennen, wenn die Zeit reif ist.

  2. Kopieren Sie alle Dateien, die aktualisiert werden müssen, und überschreiben/umbenennen/kopieren, falls erforderlich.

  3. Entfernen Sie (oder benennen Sie) Ihre App_Offline.htm-Datei um, damit IIS Benutzer zu der aktualisierten Anwendung leitet. Wenn Sie sich das Skript ansehen, können Sie sogar selbst auf die Website gehen, um die "First Load" Strafe zu bekommen, damit Ihre Endbenutzer die Dinge wie immer schön und knackig sehen.

Noch einmal, ich weiß nicht, ob Sie die Ausfallzeit auf der Website auf diese Weise leisten können, aber ich sehe den Prozess selbst als leicht skript für einen schönen automatisierte Art Prozess zu ermöglichen.

+0

Ich habe app_offline.htm vergessen. Das wird wahrscheinlich den Trick machen. –

+0

Denken Sie daran, eine beträchtliche Menge an Text in die Datei einzufügen (muss größer als 512 Byte sein, wenn der Speicher dient), um zu verhindern, dass die freundlichen Fehler im IE beim Endbenutzer Verwirrung stiften. –

3

Was meinst du mit Patchen?

Wenn Sie die Aktualisierung meinen, können Sie die Aktualisierungsdateien einfach in das Anwendungsverzeichnis kopieren. Momentan werden aktive Anfragen vollständig mit der letzten kompilierten Version Ihrer Anwendung bedient, dann wird sie neu kompiliert, um die entsprechenden Anfragen zu bedienen. Nichts Besonderes ist wirklich erforderlich.

+0

Meine Sorge ist, dass ein "Patch" aus mehreren hundert Dateien bestehen kann. Wenn die Anwendung die Dateien herunterlädt und über ihren eigenen/bin-Ordner und Inhaltsordner schreibt, würde ich erwarten, dass die App-Domain mehrfach wiederverwendet wird. Ich versuche, den Neustart der App-Domäne zu verzögern, bis alle neuen Dateien vorhanden sind. –

+0

Einfach in einen temporären Ordner herunterladen und von dort überschreiben? Datei kopieren von einem Ordner auf einen anderen das gleiche Laufwerk ist ziemlich schnell sogar für Hunderte von Dateien - sicherlich schneller als jede Neukompilierung wäre für eine App dieser Größe. –

0

Ich kenne keinen automatisierten Weg, dies zu tun. Es scheint, als wäre es einfacher, sich einfach auf ein automatisiertes Build-Skript zu verlassen, das die Änderungen an Ihren Servern auslöst.

Wenn Sie den Sitzungsstatus in einem externen Prozess beibehalten, können Sie die Site aktualisieren (was zu einem erneuten Kompilieren führt), ohne dass Ihre Benutzer rausgeschmissen werden. Sie werden nur eine längere Ladezeit haben, wenn sie auf das erneute Kompilieren warten.

+0

Dies wäre für ein kommerzielles Produkt, das an andere verkauft wird, also hätte ich keine Möglichkeit, Änderungen über ein Build-Skript zu pushen. Was ich suche, ist eine Möglichkeit, Updates für die neueste Version ähnlich den ClickOnce-Apps anzubieten. Ich denke, das Problem ist möglicherweise zu tief in der ASP.NET-Laufzeitumgebung. –

0

Ich würde nur die Versionsinformationen überprüfen, wenn das Filewatcher-Ereignis ausgelöst wird. Wenn sich die Assembly von der aktiven Assembly unterscheidet, die Sie in Erwägung ziehen, zu patchen, fahren Sie mit der Kopie fort. Wenn nicht, dann ignoriere einfach das Ereignis. Auch die Frage wäre, warum würden Sie in das temporäre Verzeichnis kopieren, von dem die Dateien zurückgewonnen werden, wenn es keine tatsächliche Versionsänderung gibt?

+0

Der Dateiwatcher befindet sich in der Laufzeit von asp.net. Ich erschaffe es nicht und ich glaube nicht, dass ich die Ereignisse ignorieren kann. –

+0

So verwenden Sie den Dateiwechsler sogar, um zu wissen, wann die neuen Dateien kopiert werden sollen, oder sprechen Sie über die Art des Frameworks, um eine DLL zu aktualisieren, wenn sie in den Ordner bin kopiert wird? – Achilles

Verwandte Themen