Wir haben einen IIS-Server, auf dem Hunderte separater Webanwendungen gehostet werden, und der physische Datenbankserver, auf dem diese Apps gehostet werden, wird für kurze Zeit zur Wartung offline geschaltet (wir erwarten, dass dies weniger als 15 Minuten dauert).
Während dieses Zeitraums möchten wir den gesamten eingehenden Datenverkehr für jede Website auf die Seite "Wir werden derzeit gewartet" umleiten.
Mir ist klar, dass ich dies tun kann, indem ich zu jeder Web-App gehe und eine IIS-Umschreiberegel einrichte, die den Benutzer für alle Anforderungen in dieser App auf eine andere Seite sendet. Aber das würde länger dauern als die Datenbankwartung!
Ich habe drei Dinge ausprobiert, von denen keines funktioniert hat:
Globale IIS-Rewrite-Regel
Ich habe nach einer einfachen Möglichkeit gesucht, eine Regel auf einen Schlag auf alle Websites anzuwenden - und diese Regel dann in einem ebenso schmerzlosen Schritt "rückgängig machen" zu können. Bisher hat keiner meiner Versuche funktioniert. Ich habe versucht, diese Umschreiberegel in meine globale web.config unter W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config einzufügen:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="redirect all requests" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
</conditions>
<action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Das hat nicht funktioniert. Wir führen .NET 4.0 64-Bit in IIS aus, aber "nur für den Fall" habe ich das Gleiche in die 32-Bit- und 2.0-globalen web.config-Dateien eingefügt und immer noch keine Änderung vorgenommen.
App_Offline.htm "spezielle Datei"
Ein weiterer Vorschlag, den ich gesehen habe, ist die "spezielle" Datei "app_offline.htm". Wir haben jedoch das gleiche Problem, dass die Bereitstellung dieser Datei im App-Stammverzeichnis aller unserer Apps länger dauert als die eigentliche Wartung.
Site "Wir sind offline" in IIS
Alle unsere Sites werden in IIS mit einer einzigen IP eingerichtet. Dies funktioniert für uns auch ohne SNA, da alle unsere Apps ein einziges SSL-Zertifikat gemeinsam nutzen (es ist ein UCC). Eine Sache, die mir einfiel, war, dass ich möglicherweise eine Site in IIS einrichten konnte, die den gesamten Datenverkehr mit der von uns verwendeten IP übereinstimmte und keinen Host-Header-Wert angab. Die Hoffnung war, dass ich ihm eine höhere "Priorität" geben könnte und dass es beim Start den gesamten Datenverkehr mit dieser IP abgleichen würde, bevor eine der anderen Sites eine Chance hatte, übereinzustimmen. Ich könnte diese Site so einrichten, dass sie für alle Anfragen dieselbe Seite bereitstellt, unabhängig von der Anforderungs-URL.
Starten Sie diese Site, wenn Sie Wartungsarbeiten durchführen, und beenden Sie sie, wenn Sie fertig sind.
Aber ich konnte dies auch nicht zum Laufen bringen, da IIS eine HTTP-Anforderung an eine spezifischere Site anzupassen scheint, bevor sie weniger spezifisch ist. Wenn Sie also einen Host-Header-Wert für diese Site "Benutzer mitteilen, dass wir offline sind" weglassen, wurde dieser nicht abgeglichen, es sei denn, die Anforderung hatte keinen Host-Header-Wert, der mit einem anderen Site übereinstimmte. Damit haben wir wieder das gleiche Problem: Wir müssen manuell zu jeder Web-App gehen und eine Aktion ausführen, um sie offline zu schalten und sie dann wieder online zu stellen, wenn wir mit der Wartung fertig sind
Gibt es einen einfachen Weg, dies zu erreichen? Es scheint, dass wir sicherlich nicht die ersten sind, die auf dieses Problem stoßen.
-Josh