Offlineschalten von Webanwendungen mit Web Deploy
von Jason Lee
In diesem Thema wird beschrieben, wie Sie eine Webanwendung für die Dauer einer automatisierten Bereitstellung mithilfe des IIS-Webbereitstellungstools (Web Deploy) offline schalten. Benutzer, die zur Webanwendung navigieren, werden zu einer App_offline.htm-Datei umgeleitet, bis die Bereitstellung abgeschlossen ist.
Dieses Thema ist Teil einer Reihe von Tutorials, die sich auf die Unternehmensbereitstellungsanforderungen eines fiktiven Unternehmens namens Fabrikam, Inc. beziehen. In dieser Tutorialreihe wird eine Beispiellösung – die Contact Manager-Lösung – verwendet, um eine Webanwendung mit einem realistischen Komplexitätsgrad darzustellen, einschließlich einer ASP.NET MVC 3-Anwendung, eines WCF-Diensts (Windows Communication Foundation) und eines Datenbankprojekts.
Die Bereitstellungsmethode im Mittelpunkt dieser Tutorials basiert auf dem unter Grundlegendes zur Projektdatei beschriebenen Ansatz für geteilte Projektdateien, bei dem der Buildprozess von zwei Projektdateien gesteuert wird– eine mit Buildanweisungen, die für jede Zielumgebung gelten, und eine mit umgebungsspezifischen Build- und Bereitstellungseinstellungen. Zur Buildzeit wird die umgebungsspezifische Projektdatei in die umgebungsunabhängige Projektdatei zusammengeführt, um einen vollständigen Satz von Buildanweisungen zu bilden.
Aufgabenübersicht
In vielen Szenarien sollten Sie eine Webanwendung offline schalten, während Sie Änderungen an zugehörigen Komponenten wie Datenbanken oder Webdiensten vornehmen. In der Regel erreichen Sie dies in IIS und ASP.NET, indem Sie eine Datei namens App_offline.htm im Stammordner der IIS-Website oder -Webanwendung ablegen. Die App_offline.htm-Datei ist eine STANDARD-HTML-Datei und enthält in der Regel eine einfache Nachricht, die den Benutzer darauf hinweist, dass die Website aufgrund von Wartungsarbeiten vorübergehend nicht verfügbar ist. Während die App_offline.htm-Datei im Stammordner der Website vorhanden ist, leitet IIS alle Anforderungen automatisch an die Datei um. Wenn Sie die Aktualisierung abgeschlossen haben, entfernen Sie die App_offline.htm-Datei , und die Website setzt die Verarbeitung von Anforderungen wie gewohnt fort.
Wenn Sie Web Deploy verwenden, um automatisierte oder einstufige Bereitstellungen in einer Zielumgebung durchzuführen, können Sie das Hinzufügen und Entfernen der App_offline.htm-Datei in Ihren Bereitstellungsprozess integrieren. Dazu müssen Sie die folgenden allgemeinen Aufgaben ausführen:
- Erstellen Sie in der Microsoft-Build-Engine-Projektdatei (MSBuild), die Sie zum Steuern des Bereitstellungsprozesses verwenden, ein MSBuild-Ziel, das eine App_offline.htm datei auf den Zielserver kopiert, bevor bereitstellungsaufgaben beginnen.
- Fügen Sie ein weiteres MSBuild-Ziel hinzu, das die App_offline.htm datei vom Zielserver entfernt, wenn alle Bereitstellungsaufgaben abgeschlossen sind.
- Erstellen Sie im Webanwendungsprojekt eine .wpp.targets-Datei , die sicherstellt, dass dem Bereitstellungspaket beim Aufrufen von Web Deploy eine App_offline.htm-Datei hinzugefügt wird.
In diesem Thema erfahren Sie, wie Sie diese Verfahren ausführen. Bei den Aufgaben und exemplarischen Vorgehensweisen in diesem Thema wird davon ausgegangen, dass Sie bereits eine Projektmappe erstellt haben, die mindestens ein Webanwendungsprojekt enthält, und dass Sie eine benutzerdefinierte Projektdatei verwenden, um den Bereitstellungsprozess zu steuern, wie unter Webbereitstellung im Unternehmen beschrieben. Alternativ können Sie die Contact Manager-Beispiellösung verwenden, um den Beispielen im Thema zu folgen.
Hinzufügen einer App_Offline-Datei zu einem Webanwendungsprojekt
Die erste Aufgabe, die Sie ausführen müssen, besteht darin, Ihrem Webanwendungsprojekt eine App_offline-Datei hinzuzufügen:
- Um zu verhindern, dass die Datei den Entwicklungsprozess beeinträchtigt (Sie möchten nicht, dass Ihre Anwendung dauerhaft offline ist), sollten Sie sie etwas anderes als App_offline.htmnennen. Sie können die Datei beispielsweise App_offline-template.htmbenennen.
- Um zu verhindern, dass die Datei unverändert bereitgestellt wird, sollten Sie die Buildaktion auf Keine festlegen.
So fügen Sie einem Webanwendungsprojekt eine App_offline-Datei hinzu
Öffnen Sie Ihre Projektmappe in Visual Studio 2010.
Klicken Sie im fenster Projektmappen-Explorer mit der rechten Maustaste auf Ihr Webanwendungsprojekt, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
Wählen Sie im Dialogfeld Neues Element hinzufügen die Option HTML-Seite aus.
Geben Sie im Feld NameApp_offline-template.htmein, und klicken Sie dann auf Hinzufügen.
Fügen Sie einige einfache HTML-Code hinzu, um Benutzer darüber zu informieren, dass die Anwendung nicht verfügbar ist, und speichern Sie dann die Datei. Schließen Sie keine serverseitigen Tags ein (z. B. Tags, denen "asp:") vorangestellt ist.
Klicken Sie im fenster Projektmappen-Explorer mit der rechten Maustaste auf die neue Datei, und klicken Sie dann auf Eigenschaften.
Wählen Sie im Fenster Eigenschaften in der Zeile Buildaktion die Option Keine aus.
Bereitstellen und Löschen einer App_Offline-Datei
Der nächste Schritt besteht darin, Ihre Bereitstellungslogik so zu ändern, dass die Datei zu Beginn des Bereitstellungsprozesses auf den Zielserver kopiert und am Ende entfernt wird.
Hinweis
Beim nächsten Verfahren wird davon ausgegangen, dass Sie eine benutzerdefinierte MSBuild-Projektdatei verwenden, um Ihren Bereitstellungsprozess zu steuern, wie unter Grundlegendes zur Projektdatei beschrieben. Wenn Sie direkt aus Visual Studio bereitstellen, müssen Sie einen anderen Ansatz verwenden. Sayed Ibrahim Hashimi beschreibt einen solchen Ansatz in How to Take Your Web App During Publishing (Wie Sie Ihre Web-App während der Veröffentlichung offline schalten).
Um eine App_offline-Datei auf einer IIS-Zielwebsite bereitzustellen, müssen Sie MSDeploy.exe mithilfe des Web Deploy contentPath-Anbieters aufrufen. Der contentPath-Anbieter unterstützt sowohl physische Verzeichnispfade als auch IIS-Website- oder Anwendungspfade, was ihn zur idealen Wahl für die Synchronisierung einer Datei zwischen einem Visual Studio-Projektordner und einer IIS-Webanwendung macht. Um die Datei bereitzustellen, sollte Ihr MSDeploy-Befehl wie folgt aussehen:
msdeploy.exe –verb:sync
-source:contentPath="[Project folder]\App_offline.template.htm"
-dest:contentPath="[IIS application path]/App_offline.htm",
computerName="[Destination web server]"
Um die Datei am Ende des Bereitstellungsprozesses vom Zielstandort zu entfernen, sollte Ihr MSDeploy-Befehl wie folgt aussehen:
msdeploy.exe –verb:delete
-dest:contentPath="[IIS application path]/App_offline.htm",
computerName="[Destination web server]"
Um diese Befehle im Rahmen eines Build- und Bereitstellungsprozesses zu automatisieren, müssen Sie sie in Ihre benutzerdefinierte MSBuild-Projektdatei integrieren. Im nächsten Verfahren wird beschrieben, wie Dies geschieht.
So stellen Sie eine App_offline-Datei bereit und löschen sie
Öffnen Sie in Visual Studio 2010 die MSBuild-Projektdatei, die Ihren Bereitstellungsprozess steuert. In der Contact Manager-Beispiellösung ist dies die Datei Publish.proj .
Erstellen Sie im Project-Stammelement ein neues PropertyGroup-Element zum Speichern von Variablen für die App_offline Bereitstellung:
<PropertyGroup> <AppOfflineTemplateFilename Condition=" '$(AppOfflineTemplateFilename)'=='' "> app_offline-template.htm </AppOfflineTemplateFilename> <AppOfflineSourcePath Condition=" '$(AppOfflineSourcePath)'==''"> $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename) </AppOfflineSourcePath> </PropertyGroup>
Die SourceRoot-Eigenschaft wird an anderer Stelle in der Datei Publish.proj definiert. Er gibt den Speicherort des Stammordners für den Quellinhalt relativ zum aktuellen Pfad an, d. h. relativ zum Speicherort der Datei Publish.proj .
Der contentPath-Anbieter akzeptiert keine relativen Dateipfade, sodass Sie einen absoluten Pfad zu Ihrer Quelldatei abrufen müssen, bevor Sie sie bereitstellen können. Dazu können Sie die Aufgabe ConvertToAbsolutePath verwenden.
Fügen Sie ein neues Target-Element mit dem Namen GetAppOfflineAbsolutePath hinzu. Verwenden Sie innerhalb dieses Ziels die Aufgabe ConvertToAbsolutePath , um einen absoluten Pfad zur App_offline-Template-Datei in Ihrem Projektordner abzurufen.
<Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline"> <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)"> <Output TaskParameter="AbsolutePaths" PropertyName="AppOfflineAbsoluteSourcePath" /> </ConvertToAbsolutePath> </Target>
Dieses Ziel verwendet den relativen Pfad zur App_offline-Vorlagendatei in Ihrem Projektordner und speichert sie als absoluten Dateipfad in einer neuen Eigenschaft. Das BeforeTargets-Attribut gibt an, dass dieses Ziel vor dem DeployAppOffline-Ziel ausgeführt werden soll, das Sie im nächsten Schritt erstellen.
Fügen Sie ein neues Ziel mit dem Namen DeployAppOffline hinzu. Rufen Sie innerhalb dieses Ziels den Befehl MSDeploy.exe auf, der Ihre App_offline datei auf dem Zielwebserver bereitstellt.
<Target Name="DeployAppOffline" Condition=" '$(EnableAppOffline'!='false' "> <PropertyGroup> <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:sync -source:contentPath="$(AppOfflineAbsoluteSourcePath)" -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm", computerName="$(MSDeployComputerName)" </_Cmd> </PropertyGroup> <Exec Command="$(_Cmd)"/> </Target>
In diesem Beispiel wird die ContactManagerIisPath-Eigenschaft an anderer Stelle in der Projektdatei definiert. Dies ist einfach ein IIS-Anwendungspfad im Format [IIS-Websitename]/[Anwendungsname]. Wenn Sie eine Bedingung in das Ziel einschließen, können Benutzer die App_offline Bereitstellung aktivieren oder deaktivieren, indem Sie einen Eigenschaftswert ändern oder einen Befehlszeilenparameter angeben.
Fügen Sie ein neues Ziel mit dem Namen DeleteAppOffline hinzu. Rufen Sie innerhalb dieses Ziels den Befehl MSDeploy.exe auf, der Ihre App_offline datei vom Zielwebserver entfernt.
<Target Name="DeleteAppOffline" Condition=" '$(EnableAppOffline'!='false' "> <PropertyGroup> <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:delete -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm", computerName="$(MSDeployComputerName)" </_Cmd> </PropertyGroup> <Exec Command="$(_Cmd)"/> </Target>
Die letzte Aufgabe besteht darin, diese neuen Ziele an geeigneten Stellen während der Ausführung Ihrer Projektdatei aufzurufen. Sie können dies auf verschiedene Arten tun. Beispielsweise gibt die FullPublishDependsOn-Eigenschaft in der Datei Publish.proj eine Liste von Zielen an, die in der Reihenfolge ausgeführt werden müssen, wenn das FullPublish-Standardziel aufgerufen wird.
Ändern Sie Ihre MSBuild-Projektdatei, um die Ziele DeployAppOffline und DeleteAppOffline an geeigneten Stellen im Veröffentlichungsprozess aufzurufen.
<PropertyGroup> <FullPublishDependsOn> Clean; BuildProjects; DeployAppOffline; GatherPackagesForPublishing; PublishDbPackages; DeployTestDBPermissions; PublishWebPackages; DeleteAppOffline; </FullPublishDependsOn> </PropertyGroup> <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
Wenn Sie Ihre benutzerdefinierte MSBuild-Projektdatei ausführen, wird die App_offline-Datei unmittelbar nach einem erfolgreichen Build auf dem Server bereitgestellt. Sie wird dann vom Server gelöscht, sobald alle Bereitstellungsaufgaben abgeschlossen sind.
Hinzufügen einer App_Offline datei zu Bereitstellungspaketen
Je nachdem, wie Sie Ihre Bereitstellung konfigurieren, können alle vorhandenen Inhalte in der IIS-Zielwebanwendung wie die App_offline.htm datei automatisch gelöscht werden, wenn Sie ein Webpaket am Ziel bereitstellen. Um sicherzustellen, dass die App_offline.htm-Datei für die Dauer der Bereitstellung beibehalten wird, müssen Sie die Datei in das Webbereitstellungspaket selbst einschließen und die Datei direkt zu Beginn des Bereitstellungsprozesses bereitstellen.
- Wenn Sie die vorherigen Aufgaben in diesem Thema ausgeführt haben, haben Sie die App_offline.htm-Datei ihrem Webanwendungsprojekt unter einem anderen Dateinamen hinzugefügt (wir haben App_offline-template.htmverwendet), und Sie haben die Buildaktion auf Keine festgelegt. Diese Änderungen sind erforderlich, um zu verhindern, dass die Datei die Entwicklung und das Debuggen beeinträchtigt. Daher müssen Sie den Paketerstellungsprozess anpassen, um sicherzustellen, dass die App_offline.htm-Datei im Webbereitstellungspaket enthalten ist.
Die Web publishing Pipeline (WPP) verwendet eine Elementliste namens FilesForPackagingFromProject , um eine Liste von Dateien zu erstellen, die in das Webbereitstellungspaket aufgenommen werden sollen. Sie können den Inhalt Ihrer Webpakete anpassen, indem Sie dieser Liste Ihre eigenen Elemente hinzufügen. Dazu müssen Sie die folgenden allgemeinen Schritte ausführen:
Erstellen Sie eine benutzerdefinierte Projektdatei namens [Projektname].wpp.targets im selben Ordner wie Ihre Projektdatei.
Hinweis
Die Datei .wpp.targets muss sich in demselben Ordner wie ihre Webanwendungsprojektdatei (z. B. ContactManager.Mvc.csproj) befinden und nicht im selben Ordner wie alle benutzerdefinierten Projektdateien, die Sie zum Steuern des Build- und Bereitstellungsprozesses verwenden.
Erstellen Sie in der Datei .wpp.targets ein neues MSBuild-Ziel, das vor demZiel CopyAllFilesToSingleFolderForPackage ausgeführt wird. Dies ist das WPP-Ziel, das eine Liste der Elemente erstellt, die in das Paket aufgenommen werden sollen.
Erstellen Sie im neuen Ziel ein ItemGroup-Element .
Fügen Sie im ItemGroup-Element ein FilesForPackagingFromProject-Element hinzu, und geben Sie die App_offline.htm-Datei an.
Die Datei .wpp.targets sollte wie folgt aussehen:
<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AddAppOfflineToPackage"
BeforeTargets="CopyAllFilesToSingleFolderForPackage">
<ItemGroup>
<FilesForPackagingFromProject Include="App_offline-template.htm">
<DestinationRelativePath>App_offline.htm</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
Dies sind die wichtigsten Punkte in diesem Beispiel:
- Das BeforeTargets-Attribut fügt dieses Ziel in das WPP ein, indem angegeben wird, dass es unmittelbar vor dem Ziel CopyAllFilesToSingleFolderForPackage ausgeführt werden soll.
- Das FilesForPackagingFromProject-Element verwendet den DestinationRelativePath-Metadatenwert , um die Datei von App_offline-template.htm in App_offline.htm umzubenennen, während sie der Liste hinzugefügt wird.
Im nächsten Verfahren wird gezeigt, wie Sie diese .wpp.targets-Datei zu einem Webanwendungsprojekt hinzufügen.
So fügen Sie eine WPP.targets-Datei zu einem Webbereitstellungspaket hinzu
Öffnen Sie Ihre Projektmappe in Visual Studio 2010.
Klicken Sie im Projektmappen-Explorer Fenster mit der rechten Maustaste auf den Projektknoten Ihrer Webanwendung (z. B. ContactManager.Mvc), zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
Wählen Sie im Dialogfeld Neues Element hinzufügen die XML-Dateivorlage aus.
Geben Sie im Feld Nameden Namen [Projektname].wpp.targets ein (z. B. ContactManager.Mvc.wpp.targets), und klicken Sie dann auf Hinzufügen.
Hinweis
Wenn Sie dem Stammknoten eines Projekts ein neues Element hinzufügen, wird die Datei im selben Ordner wie die Projektdatei erstellt. Sie können dies überprüfen, indem Sie den Ordner in Windows Explorer öffnen.
Fügen Sie in der Datei das zuvor beschriebene MSBuild-Markup hinzu.
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="AddAppOfflineToPackage" BeforeTargets="CopyAllFilesToSingleFolderForPackage"> <ItemGroup> <FilesForPackagingFromProject Include="App_offline-template.htm"> <DestinationRelativePath>App_offline.htm</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> </Target> </Project>
Speichern und schließen Sie die Datei [Projektname].wpp.targets .
Wenn Sie das nächste Mal Ihr Webanwendungsprojekt erstellen und packen, erkennt das WPP automatisch die Datei .wpp.targets . Die App_offline-template.htm datei wird im resultierenden Webbereitstellungspaket als App_offline.htmeingeschlossen.
Hinweis
Wenn die Bereitstellung fehlschlägt, bleibt die App_offline.htm-Datei vorhanden, und Ihre Anwendung bleibt offline. Hierbei handelt es sich in der Regel um das gewünschte Verhalten. Um Ihre Anwendung wieder online zu schalten, können Sie die App_offline.htm-Datei von Ihrem Webserver löschen. Alternativ wird die dateiApp_offline.htm entfernt, wenn Sie Fehler beheben und eine erfolgreiche Bereitstellung ausführen.
Zusammenfassung
In diesem Thema wurde beschrieben, wie Sie eine Webanwendung für die Dauer einer Bereitstellung offline schalten, indem Sie zu Beginn des Bereitstellungsprozesses eine App_offline.htm Datei auf dem Zielserver veröffentlichen und sie am Ende entfernen. Außerdem wurde beschrieben, wie eine App_offline.htm-Datei in ein Webbereitstellungspaket eingeschlossen wird.
Weitere Informationen
Weitere Informationen zum Paket- und Bereitstellungsprozess finden Sie unter Erstellen und Verpacken von Webanwendungsprojekten, Konfigurieren von Parametern für die Webpaketbereitstellung und Bereitstellen von Webpaketen.
Wenn Sie Ihre Webanwendungen direkt in Visual Studio veröffentlichen und nicht den in diesen Tutorials beschriebenen benutzerdefinierten MSBuild-Projektdateiansatz verwenden, müssen Sie einen etwas anderen Ansatz verwenden, um Ihre Anwendung während des Veröffentlichungsprozesses offline zu schalten.