Freigeben über


Deaktivieren von Webanwendungen mit Web-Bereitstellung

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 Lernprogrammen basierend auf den Anforderungen an die Unternehmensbereitstellung eines fiktiven Unternehmens namens Fabrikam, Inc. In dieser Lernprogrammreihe wird eine Beispiellösung – die Contact Manager-Lösung – verwendet, um eine Webanwendung mit einer realistischen Komplexitätsstufe darzustellen, einschließlich einer ASP.NET MVC 3-Anwendung, einem WCF-Dienst (Windows Communication Foundation) und einem Datenbankprojekt.

Die Bereitstellungsmethode im Mittelpunkt dieser Lernprogramme basiert auf dem geteilten Projektdateiansatz, der unter "Grundlegendes zur Projektdatei" beschrieben wird, in 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 integriert, 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 verwandten Komponenten vornehmen, z. B. Datenbanken oder Webdienste. Normalerweise erreichen Sie dies in IIS und ASP.NET, indem Sie eine Datei namens App_offline.htm im Stammordner der IIS-Website oder Webanwendung platzieren. Die App_offline.htm Datei ist eine Standard-HTML-Datei und enthält in der Regel eine einfache Meldung, die den Benutzer darauf hinweist, dass die Website aufgrund der Wartung 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 weiter. Wenn Sie die Aktualisierung abgeschlossen haben, entfernen Sie die App_offline.htm Datei, und die Website setzt die Bereitstellung von Anforderungen wie gewohnt fort.

Wenn Sie Web Deploy zum Ausführen automatisierter oder einstufiger Bereitstellungen in einer Zielumgebung verwenden, sollten Sie das Hinzufügen und Entfernen der App_offline.htm Datei in Ihren Bereitstellungsprozess integrieren. Dazu müssen Sie diese 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 alle 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 eine App_offline.htm Datei dem Bereitstellungspaket hinzugefügt wird, wenn Web Deploy aufgerufen 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 Lösung erstellt haben, die mindestens ein Webanwendungsprojekt enthält, und dass Sie eine benutzerdefinierte Projektdatei verwenden, um den Bereitstellungsprozess zu steuern, wie in der 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, ist das Hinzufügen einer App_offline Datei zu Ihrem Webanwendungsprojekt:

  • 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.htmaufrufen. Sie können beispielsweise die Datei App_offline-template.htmbenennen.
  • Um zu verhindern, dass die Datei as-isbereitgestellt wird, sollten Sie die Buildaktion auf "Keine" festlegen.

So fügen Sie einem Webanwendungsprojekt eine App_offline Datei hinzu

  1. Öffnen Sie Ihre Lösung in Visual Studio 2010.

  2. Klicken Sie im Projektmappen-Explorer-Fenster mit der rechten Maustaste auf Ihr Webanwendungsprojekt, zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Neues Element".

  3. Wählen Sie im Dialogfeld " Neues Element hinzufügen " die OPTION "HTML-Seite" aus.

  4. Geben Sie im Feld "Name " App_offline-template.htmein, und klicken Sie dann auf "Hinzufügen".

    Geben Sie im Feld

  5. Fügen Sie einen einfachen HTML-Code hinzu, um Benutzer darüber zu informieren, dass die Anwendung nicht verfügbar ist, und speichern Sie dann die Datei. Fügen Sie keine serverseitigen Tags hinzu (z. B. alle Tags, denen "asp:" vorangestellt ist).

    Fügen Sie einige einfache H T M L hinzu, um Benutzer darüber zu informieren, dass die Anwendung nicht verfügbar ist, und speichern Sie dann die Datei.

  6. Klicken Sie im Projektmappen-Explorer-Fenster mit der rechten Maustaste auf die neue Datei, und klicken Sie dann auf Eigenschaften.

  7. Wählen Sie im Fenster "Eigenschaften" in der Zeile "Build-Aktion", "Keine" aus.

    Wählen Sie im Fenster

Bereitstellen und Löschen einer App_Offline-Datei

Der nächste Schritt besteht darin, Die Bereitstellungslogik so zu ändern, dass die Datei am Anfang des Bereitstellungsprozesses auf den Zielserver kopiert und am Ende entfernt wird.

Hinweis

Im nächsten Verfahren wird davon ausgegangen, dass Sie eine benutzerdefinierte MSBuild-Projektdatei verwenden, um den 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 Wie Sie Ihre Web-App während der Veröffentlichung offline nehmen.

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 die ideale 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 von der Zielwebsite 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 als Teil 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

  1. Öffnen Sie in Visual Studio 2010 die MSBuild-Projektdatei, die Den Bereitstellungsprozess steuert. In der Contact Manager-Beispiellösung ist dies die Datei Publish.proj .

  2. Im Project-Stammelement erstellen Sie ein neues PropertyGroup-Element zum Speichern von Variablen für die Bereitstellung von App_offline:

    <PropertyGroup>
      <AppOfflineTemplateFilename   
        Condition=" '$(AppOfflineTemplateFilename)'=='' ">
          app_offline-template.htm
      </AppOfflineTemplateFilename>
      <AppOfflineSourcePath 
        Condition=" '$(AppOfflineSourcePath)'==''">
          $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename)
      </AppOfflineSourcePath>
    </PropertyGroup>
    
  3. 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 Publish.proj-Datei .

  4. Der ContentPath-Anbieter akzeptiert keine relativen Dateipfade, daher müssen Sie einen absoluten Pfad zu Ihrer Quelldatei abrufen, bevor Sie sie bereitstellen können. Dazu können Sie die Aufgabe ConvertToAbsolutePath verwenden.

  5. Fügen Sie ein neues Target-Element namens "GetAppOfflineAbsolutePath" hinzu. Verwenden Sie in diesem Ziel die Aufgabe ConvertToAbsolutePath , um einen absoluten Pfad zur App_offline-Vorlagendatei in Ihrem Projektordner abzurufen.

    <Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline">
      <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)">
        <Output TaskParameter="AbsolutePaths"       
                PropertyName="AppOfflineAbsoluteSourcePath" />
      </ConvertToAbsolutePath>
    </Target>
    
  6. 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.

  7. Fügen Sie ein neues Ziel namens DeployAppOffline hinzu. Rufen Sie in diesem Ziel 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>
    
  8. In diesem Beispiel wird die ContactManagerIisPath-Eigenschaft an anderer Stelle in der Projektdatei definiert. Dies ist einfach ein IIS-Anwendungspfad in Form [IIS-Websitename]/[Anwendungsname]. Durch Das Einschließen einer Bedingung in das Ziel können Benutzer die App_offline Bereitstellung aktivieren oder deaktivieren, indem Sie einen Eigenschaftswert ändern oder einen Befehlszeilenparameter bereitstellen.

  9. Fügen Sie ein neues Ziel namens DeleteAppOffline hinzu. Rufen Sie in diesem Ziel den befehl MSDeploy.exe auf, mit dem Ihre App_offline Datei vom Zielwebserver entfernt wird.

    <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>
    
  10. Der letzte Vorgang besteht darin, diese neuen Ziele an geeigneten Punkten während der Ausführung der 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 ausgeführt werden müssen, wenn das FullPublish-Standardziel aufgerufen wird.

  11. Ändern Sie Die MSBuild-Projektdatei so, dass die Ziele DeployAppOffline und DeleteAppOffline an entsprechenden Stellen im Veröffentlichungsprozess aufgerufen werden.

    <PropertyGroup>
      <FullPublishDependsOn>
        Clean;
        BuildProjects; 
        DeployAppOffline;
        GatherPackagesForPublishing;
        PublishDbPackages;
        DeployTestDBPermissions;
        PublishWebPackages;
        DeleteAppOffline;
      </FullPublishDependsOn> 
    </PropertyGroup>
    <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
    

Wenn Sie Die 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 Die Bereitstellung konfigurieren, werden alle vorhandenen Inhalte an der IIS-Zielwebanwendung wie der App_offline.htm-Datei möglicherweise automatisch gelöscht, wenn Sie ein Webpaket am Ziel bereitstellen. Um sicherzustellen, dass die App_offline.htm-Datei während der gesamten Bereitstellungszeit vorhanden bleibt, müssen Sie die Datei im Webbereitstellungspaket selbst einbeziehen und zusätzlich gleich zu Beginn des Bereitstellungsprozesses bereitstellen.

  • Wenn Sie die vorherigen Aufgaben in diesem Thema befolgt haben, haben Sie die App_offline.htm Datei zu 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 Verpackungsprozess anpassen, um sicherzustellen, dass die App_offline.htm Datei im Webbereitstellungspaket enthalten ist.

Die Web Publishing Pipeline (WPP) verwendet eine Elementliste mit dem Namen FilesForPackagingFromProject , um eine Liste von Dateien zu erstellen, die im Webbereitstellungspaket enthalten sein sollen. Sie können den Inhalt Ihrer Webpakete anpassen, indem Sie ihrer Liste eigene Elemente hinzufügen. Dazu müssen Sie die folgenden allgemeinen Schritte ausführen:

  1. Erstellen Sie eine benutzerdefinierte Projektdatei namens [Projektname].wpp.targets im selben Ordner wie Ihre Projektdatei.

    Hinweis

    Die Datei ".wpp.targets " muss sich im selben Ordner wie die Webanwendungsprojektdatei (z. B. ContactManager.Mvc.csproj) und nicht im selben Ordner wie alle benutzerdefinierten Projektdateien befinden, die Sie zum Steuern des Build- und Bereitstellungsprozesses verwenden.

  2. Erstellen Sie in der Datei ".wpp.targets " ein neues MSBuild-Ziel, das vor dem CopyAllFilesToSingleFolderForPackage-Ziel ausgeführt wird. Dies ist das WPP-Ziel, das eine Liste der Elemente erstellt, die in das Paket eingeschlossen werden sollen.

  3. Erstellen Sie im neuen Ziel ein ItemGroup-Element .

  4. 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 CopyAllFilesToSingleFolderForPackage-Ziel 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.

Das nächste Verfahren zeigt, wie Sie diese WPP.Targets-Datei zu einem Webanwendungsprojekt hinzufügen.

So fügen Sie eine WPP.targets-Datei zu einem Webbereitstellungspaket hinzu

  1. Öffnen Sie Ihre Lösung in Visual Studio 2010.

  2. Klicken Sie im Projektmappen-Explorer-Fenster mit der rechten Maustaste auf ihren Webanwendungsprojektknoten (z. B. ContactManager.Mvc), zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Neues Element".

  3. Wählen Sie im Dialogfeld " Neues Element hinzufügen " die XML-Dateivorlage aus.

  4. Geben Sie im Feld "Name " [Projektname].wpp.targets (z. B. ContactManager.Mvc.wpp.targets) ein, und klicken Sie dann auf "Hinzufügen".

    Geben Sie im Feld

    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 im Windows-Explorer öffnen.

  5. 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>
    
  6. Speichern und schließen Sie die Datei [Projektname].wpp.targets .

Wenn Sie ihr Webanwendungsprojekt das nächste Mal erstellen und verpacken, erkennt das WPP automatisch die WPP.targets-Datei . Die App_offline-template.htm Datei wird als App_offline.htmin das resultierende Webbereitstellungspaket eingeschlossen.

Hinweis

Wenn die Bereitstellung fehlschlägt, bleibt die App_offline.htm Datei vorhanden, und Ihre Anwendung bleibt offline. Dies ist in der Regel das gewünschte Verhalten. Um Ihre Anwendung wieder online zu schalten, können Sie die App_offline.htm Datei von Ihrem Webserver löschen. Wenn Sie Fehler korrigieren und eine erfolgreiche Bereitstellung ausführen, wird die App_offline.htm Datei entfernt.

Fazit

In diesem Thema wird beschrieben, wie Sie eine Webanwendung für die Dauer einer Bereitstellung offline schalten, indem Sie eine App_offline.htm Datei zu Beginn des Bereitstellungsprozesses auf dem Zielserver veröffentlichen und am Ende entfernen. Außerdem wird erläutert, wie Sie eine App_offline.htm Datei in ein Webbereitstellungspaket einschließen.

Weiterführende Lektüre

Weitere Informationen zum Paket- und Bereitstellungsprozess finden Sie unter Building and Packaging Web Application Projects, Configuring Parameters for Web Package Deployment, and Deploying Web Packages.

Wenn Sie Ihre Webanwendungen direkt aus Visual Studio veröffentlichen, anstatt den in diesen Lernprogrammen beschriebenen benutzerdefinierten MSBuild-Projektdateiansatz zu verwenden, müssen Sie während des Veröffentlichungsprozesses einen etwas anderen Ansatz verwenden, um Ihre Anwendung offline zu schalten.