Impostazione delle applicazioni Web in modalità offline con Distribuzione Web

di Jason Lee

Questo argomento descrive come accettare un'applicazione Web offline per la durata di una distribuzione automatizzata usando lo strumento di distribuzione Web Internet Information Services (IIS). Gli utenti che passano all'applicazione Web vengono reindirizzati a un file App_offline.htm fino al completamento della distribuzione.

Questo argomento fa parte di una serie di esercitazioni basate sui requisiti di distribuzione aziendali di una società fittizia denominata Fabrikam, Inc. Questa serie di esercitazioni usa una soluzione di esempio, la soluzione Contact Manager, per rappresentare un'applicazione Web con un livello realistico di complessità, tra cui un'applicazione MVC 3 ASP.NET, un servizio Windows Communication Foundation (WCF) e un progetto di database.

Il metodo di distribuzione al centro di queste esercitazioni si basa sull'approccio di suddivisione del file di progetto descritto in Informazioni sul file di progetto, in cui il processo di compilazione è controllato da due file di progetto, uno contenente istruzioni di compilazione che si applicano a ogni ambiente di destinazione e uno contenente le impostazioni di compilazione e distribuzione specifiche dell'ambiente. In fase di compilazione, il file di progetto specifico dell'ambiente viene unito al file di progetto agnostico dell'ambiente per formare un set completo di istruzioni di compilazione.

Panoramica delle attività

In molti scenari, si vuole accettare un'applicazione Web offline mentre si apportano modifiche ai componenti correlati, ad esempio database o servizi Web. In genere, in IIS e ASP.NET, si esegue questa operazione inserendo un file denominato App_offline.htm nella cartella radice del sito Web IIS o dell'applicazione Web. Il file App_offline.htm è un file HTML standard e in genere conterrà un semplice messaggio che avvisa l'utente che il sito non è temporaneamente disponibile a causa della manutenzione. Anche se il file diApp_offline.htm esiste nella cartella radice del sito Web, IIS reindirizzerà automaticamente le richieste al file. Al termine dell'esecuzione degli aggiornamenti, rimuovere il file App_offline.htm e il sito Web riprende a gestire le richieste come di consueto.

Quando si usa Distribuzione Web per eseguire distribuzioni automatizzate o in un unico passaggio in un ambiente di destinazione, è possibile incorporare l'aggiunta e la rimozione del file diApp_offline.htm nel processo di distribuzione. A tale scopo, è necessario completare queste attività di alto livello:

  • Nel file di progetto Microsoft Build Engine (MSBuild) usato per controllare il processo di distribuzione creare una destinazione MSBuild che copia un file App_offline.htm nel server di destinazione prima dell'avvio di qualsiasi attività di distribuzione.
  • Aggiungere un'altra destinazione MSBuild che rimuove il file diApp_offline.htm dal server di destinazione al termine di tutte le attività di distribuzione.
  • Nel progetto applicazione Web creare un file con estensione wpp.targets che garantisce che un file App_offline.htm venga aggiunto al pacchetto di distribuzione quando viene richiamata la distribuzione Web.

Questo argomento illustra come eseguire queste procedure. Le attività e le procedure dettagliate in questo argomento presuppongono che sia già stata creata una soluzione contenente almeno un progetto applicazione Web e che si usi un file di progetto personalizzato per controllare il processo di distribuzione come descritto in Distribuzione Web in Enterprise. In alternativa, è possibile usare la soluzione di esempio Contact Manager per seguire gli esempi nell'argomento.

Aggiunta di un file App_Offline a un progetto applicazione Web

La prima attività da completare consiste nell'aggiungere un file App_offline al progetto dell'applicazione Web:

  • Per impedire l'interferimento del file con il processo di sviluppo (non si vuole che l'applicazione sia definitivamente offline), è consigliabile chiamarla diversa da App_offline.htm. Ad esempio, è possibile assegnare un nome al file App_offline-template.htm.
  • Per evitare che il file venga distribuito come è, è necessario impostare l'azione di compilazione su Nessuno.

Per aggiungere un file App_offline a un progetto applicazione Web

  1. Aprire la soluzione in Visual Studio 2010.

  2. Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto applicazione Web, scegliere Aggiungi e quindi fare clic su Nuovo elemento.

  3. Nella finestra di dialogo Aggiungi nuovo elemento selezionare Pagina HTML.

  4. Nella casella Nome digitare App_offline-template.htme quindi fare clic su Aggiungi.

    Nella casella Nome digitare App_offline-template.htm e quindi fare clic su Aggiungi.

  5. Aggiungere un codice HTML semplice per informare gli utenti che l'applicazione non è disponibile e quindi salvare il file. Non includere tag lato server (ad esempio, eventuali tag con prefisso "asp:").

    Aggiungere alcuni semplici H T M L per informare gli utenti che l'applicazione non è disponibile e quindi salvare il file.

  6. Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul nuovo file e quindi scegliere Proprietà.

  7. Nella finestra Proprietàselezionare Nessuna nella riga Azione di compilazione.

    Nella riga Azione di compilazione della Finestra Proprietà selezionare Nessuna.

Distribuzione ed eliminazione di un file di App_Offline

Il passaggio successivo consiste nel modificare la logica di distribuzione per copiare il file nel server di destinazione all'inizio del processo di distribuzione e rimuoverlo alla fine.

Nota

La procedura successiva presuppone che si usi un file di progetto MSBuild personalizzato per controllare il processo di distribuzione, come descritto in Informazioni sul file di progetto. Se si distribuisce direttamente da Visual Studio, è necessario usare un approccio diverso. Sayed Ibrahim Hashimi descrive un approccio di questo tipo in Come prendere offline l'app Web durante la pubblicazione.

Per distribuire un file App_offline in un sito Web IIS di destinazione, è necessario richiamare MSDeploy.exe usando il provider Web Deploy contentPath. Il provider contentPath supporta sia i percorsi della directory fisica che i percorsi dell'applicazione IIS, che rende la scelta ideale per la sincronizzazione di un file tra una cartella del progetto di Visual Studio e un'applicazione Web IIS. Per distribuire il file, il comando MSDeploy dovrebbe essere simile al seguente:

msdeploy.exe –verb:sync
             -source:contentPath="[Project folder]\App_offline.template.htm"
             -dest:contentPath="[IIS application path]/App_offline.htm",
              computerName="[Destination web server]"

Per rimuovere il file dal sito di destinazione alla fine del processo di distribuzione, il comando MSDeploy dovrebbe essere simile al seguente:

msdeploy.exe –verb:delete
             -dest:contentPath="[IIS application path]/App_offline.htm",
              computerName="[Destination web server]"

Per automatizzare questi comandi come parte di un processo di compilazione e distribuzione, è necessario integrarli nel file di progetto MSBuild personalizzato. La procedura successiva descrive come eseguire questa operazione.

Per distribuire ed eliminare un file di App_offline

  1. In Visual Studio 2010 aprire il file di progetto MSBuild che controlla il processo di distribuzione. Nella soluzione di esempio Contact Manager si tratta del file Publish.proj .

  2. Nell'elemento Project radice creare un nuovo elemento PropertyGroup per archiviare le variabili per la distribuzione di App_offline :

    <PropertyGroup>
      <AppOfflineTemplateFilename   
        Condition=" '$(AppOfflineTemplateFilename)'=='' ">
          app_offline-template.htm
      </AppOfflineTemplateFilename>
      <AppOfflineSourcePath 
        Condition=" '$(AppOfflineSourcePath)'==''">
          $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename)
      </AppOfflineSourcePath>
    </PropertyGroup>
    
  3. La proprietà SourceRoot è definita altrove nel file Publish.proj . Indica il percorso della cartella radice per il contenuto di origine rispetto al percorso corrente, in altre parole, rispetto al percorso del file Publish.proj .

  4. Il provider contentPath non accetta percorsi file relativi, quindi è necessario ottenere un percorso assoluto al file di origine prima di poterlo distribuire. È possibile usare l'attività ConvertToAbsolutePath per eseguire questa operazione.

  5. Aggiungere un nuovo elemento Target denominato GetAppOfflineAbsolutePath. All'interno di questa destinazione, usare l'attività ConvertToAbsolutePath per ottenere un percorso assoluto al file App_offline-modello nella cartella del progetto.

    <Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline">
      <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)">
        <Output TaskParameter="AbsolutePaths"       
                PropertyName="AppOfflineAbsoluteSourcePath" />
      </ConvertToAbsolutePath>
    </Target>
    
  6. Questa destinazione accetta il percorso relativo del file App_offline-modello nella cartella del progetto e lo salva in una nuova proprietà come percorso di file assoluto. L'attributo BeforeTargets specifica che si vuole eseguire questa destinazione prima della destinazione DeployAppOffline , che verrà creata nel passaggio successivo.

  7. Aggiungere una nuova destinazione denominata DeployAppOffline. All'interno di questa destinazione, richiamare il comando MSDeploy.exe che distribuisce il file App_offline nel server Web di destinazione.

    <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 questo esempio la proprietà ContactManagerIisPath viene definita altrove nel file di progetto. Si tratta semplicemente di un percorso applicazione IIS, nel formato [Nome sito Web IIS]/[Nome applicazione]. Inclusa una condizione nella destinazione consente agli utenti di modificare o disattivare la distribuzione di App_offline modificando un valore della proprietà o fornendo un parametro della riga di comando.

  9. Aggiungere una nuova destinazione denominata DeleteAppOffline. All'interno di questa destinazione, richiamare il comando MSDeploy.exe che rimuove il file App_offline dal server Web di destinazione.

    <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. L'attività finale consiste nel richiamare queste nuove destinazioni in punti appropriati durante l'esecuzione del file di progetto. È possibile eseguire questa operazione in vari modi. Ad esempio, nel file Publish.proj la proprietà FullPublishDependsOn specifica un elenco di destinazioni da eseguire in ordine quando viene richiamata la destinazione predefinita FullPublish .

  11. Modificare il file di progetto MSBuild per richiamare le destinazioni DeployAppOffline e DeleteAppOffline in punti appropriati nel processo di pubblicazione.

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

Quando si esegue il file di progetto MSBuild personalizzato, il file di App_offline verrà distribuito nel server immediatamente dopo una compilazione completata. Verrà quindi eliminato dal server una volta completate tutte le attività di distribuzione.

Aggiunta di un file App_Offline ai pacchetti di distribuzione

A seconda della configurazione della distribuzione, qualsiasi contenuto esistente nell'applicazione Web IIS di destinazione, ad esempio il file App_offline.htm , può essere eliminato automaticamente quando si distribuisce un pacchetto Web nella destinazione. Per assicurarsi che il file diApp_offline.htm rimanga al posto per la durata della distribuzione, è necessario includere il file all'interno del pacchetto di distribuzione Web stesso oltre a distribuire il file direttamente all'inizio del processo di distribuzione.

  • Se in questo argomento sono state seguite le attività precedenti, è stato aggiunto il file diApp_offline.htm al progetto dell'applicazione Web in un nome file diverso (è stato usato App_offline-template.htm) e verrà impostata l'azione di compilazione su Nessuno. Queste modifiche sono necessarie per impedire all'interferimento del file con lo sviluppo e il debug. Di conseguenza, è necessario personalizzare il processo di creazione pacchetti per assicurarsi che il file diApp_offline.htm sia incluso nel pacchetto di distribuzione Web.

La pipeline di pubblicazione Web (WPP) usa un elenco di elementi denominato FilesForPackagingFromProject per compilare un elenco di file che devono essere inclusi nel pacchetto di distribuzione Web. È possibile personalizzare il contenuto dei pacchetti Web aggiungendo elementi personalizzati a questo elenco. A tale scopo, è necessario completare questi passaggi di alto livello:

  1. Creare un file di progetto personalizzato denominato [nome progetto].wpp.targets nella stessa cartella del file di progetto.

    Nota

    Il file con estensione wpp.targets deve entrare nella stessa cartella del file di progetto dell'applicazione Web, ad esempio ContactManager.Mvc.csproj, anziché nella stessa cartella di tutti i file di progetto personalizzati usati per controllare il processo di compilazione e distribuzione.

  2. Nel file .wpp.targets creare una nuova destinazione MSBuild eseguita prima della destinazione CopyAllFilesToSingleFolderForPackage . Si tratta della destinazione WPP che compila un elenco di elementi da includere nel pacchetto.

  3. Nella nuova destinazione creare un elemento ItemGroup .

  4. Nell'elemento ItemGroup aggiungere un elemento FilesForPackagingFromProject e specificare il file App_offline.htm .

Il file .wpp.targets dovrebbe essere simile al seguente:

<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>

Questi sono i punti chiave della nota in questo esempio:

  • L'attributo BeforeTargets inserisce questa destinazione nel WPP specificando che deve essere eseguita immediatamente prima della destinazione CopyAllFilesToSingleFolderForPackage .
  • L'elemento FilesForPackagingFromProject usa il valore dei metadati DestinationRelativePath per rinominare il file da App_offline-template.htm a App_offline.htm quando viene aggiunto all'elenco.

La procedura successiva illustra come aggiungere questo file .wpp.targets a un progetto applicazione Web.

Per aggiungere un file con estensione wpp.targets a un pacchetto di distribuzione Web

  1. Aprire la soluzione in Visual Studio 2010.

  2. Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto applicazione Web, ad esempio ContactManager.Mvc, scegliere Aggiungi e quindi fare clic su Nuovo elemento.

  3. Nella finestra di dialogo Aggiungi nuovo elemento selezionare il modello di file XML .

  4. Nella casella Nome digitare [nome progetto].wpp.targets (ad esempio, ContactManager.Mvc.wpp.targets) e quindi fare clic su Aggiungi.

    Nella casella Nome digitare il nome del progetto .wpp.targets, quindi fare clic su Aggiungi.

    Nota

    Se si aggiunge un nuovo elemento al nodo radice di un progetto, il file viene creato nella stessa cartella del file di progetto. È possibile verificare questa operazione aprendo la cartella in Esplora risorse.

  5. Nel file aggiungere il markup MSBuild descritto in precedenza.

    <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. Salvare e chiudere il file [nome progetto].wpp.targets .

Alla successiva compilazione e pacchetto del progetto dell'applicazione Web, il file WPP rileverà automaticamente il file con estensione wpp.targets . Il file diApp_offline-template.htm verrà incluso nel pacchetto di distribuzione Web risultante come App_offline.htm.

Nota

Se la distribuzione ha esito negativo, il file diApp_offline.htm rimarrà attivo e l'applicazione rimarrà offline. Questo è in genere il comportamento desiderato. Per ripristinare l'applicazione online, è possibile eliminare il file diApp_offline.htm dal server Web. In alternativa, se si correggeranno eventuali errori ed si esegue una distribuzione riuscita, il file diApp_offline.htm verrà rimosso.

Conclusione

In questo argomento è stato descritto come accettare un'applicazione Web offline per la durata di una distribuzione, pubblicando un file App_offline.htm nel server di destinazione all'inizio del processo di distribuzione e rimuovendolo alla fine. È stato anche illustrato come includere un file diApp_offline.htm in un pacchetto di distribuzione Web.

Altre informazioni

Per altre informazioni sul processo di creazione di pacchetti e distribuzione, vedere Compilazione e creazione di progetti applicazione Web per la creazione e la creazione di pacchetti Web, configurazione dei parametri per la distribuzione di pacchetti Web e distribuzione di pacchetti Web.

Se si pubblicano le applicazioni Web direttamente da Visual Studio, anziché usare l'approccio personalizzato del file di progetto MSBuild descritto in queste esercitazioni, è necessario usare un approccio leggermente diverso per portare offline l'applicazione durante il processo di pubblicazione.