Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
di Jason Lee
In questo argomento viene descritto come portare offline un'applicazione Web per la durata di una distribuzione automatizzata tramite lo strumento di distribuzione Web Internet Information Services (IIS) (Distribuzione Web). Gli utenti che accedono all'applicazione Web vengono reindirizzati a un fileApp_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 ASP.NET MVC 3, un servizio Windows Communication Foundation (WCF) e un progetto di database.
Il metodo di distribuzione al centro di queste esercitazioni si basa sull'approccio split project file descritto in Informazioni sul file di progetto, in cui il processo di compilazione è controllato da due file di progetto, uno contenente istruzioni di compilazione applicabili 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 indipendente dall'ambiente per formare un set completo di istruzioni di compilazione.
Panoramica delle attività
In molti scenari, è consigliabile portare offline un'applicazione Web mentre si apportano modifiche ai componenti correlati, ad esempio database o servizi Web. In genere, in IIS e ASP.NET, è possibile eseguire questa operazione inserendo un file denominato App_offline.htm nella cartella radice del sito Web IIS o dell'applicazione Web. Il fileApp_offline.htm è un file HTML standard e in genere conterrà un semplice messaggio che informa l'utente che il sito è temporaneamente non disponibile a causa della manutenzione. Mentre il fileApp_offline.htm esiste nella cartella radice del sito Web, IIS reindirizzerà automaticamente le richieste al file. Quando hai finito di eseguire gli aggiornamenti, rimuovi 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 a passaggio singolo in un ambiente di destinazione, è consigliabile incorporare l'aggiunta e la rimozione del file App_offline.htm nel processo di distribuzione. A tale scopo, è necessario completare queste attività generali:
- 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'inizio di qualsiasi attività di distribuzione.
- Aggiungere un'altra destinazione MSBuild che rimuove il file App_offline.htm dal server di destinazione al termine di tutte le attività di distribuzione.
- Nel progetto dell'applicazione Web creare un file .wpp.targets che garantisca l'aggiunta di un file App_offline.htm al pacchetto di distribuzione quando viene invocato Web Deploy.
In questo argomento verrà illustrato 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 di applicazione Web e che si usi un file di progetto personalizzato per controllare il processo di distribuzione come descritto in Distribuzione Web nell'organizzazione. 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 di applicazione Web
La prima attività da completare consiste nell'aggiungere un file App_offline al progetto dell'applicazione Web:
- Per impedire che il file interferisca con il processo di sviluppo (non si vuole che l'applicazione sia offline in modo permanente), è consigliabile chiamarla diversa da App_offline.htm. Ad esempio, è possibile denominare il file App_offline-template.htm.
- Per impedire la distribuzione del file as-is, è necessario impostare l'azione di compilazione su Nessuno.
Per aggiungere un file App_offline a un progetto di applicazione Web
Aprire la soluzione in Visual Studio 2010.
Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto dell'applicazione Web, scegliere Aggiungi e quindi fare clic su Nuovo elemento.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare Pagina HTML.
Nella casella Nome digitare App_offline-template.htme quindi fare clic su Aggiungi.
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 preceduti da "asp:").
Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul nuovo file e quindi scegliere Proprietà.
Nella riga Azione di compilazione della finestra Proprietàselezionare Nessuno.
Distribuzione ed eliminazione di un file 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.
Annotazioni
La procedura successiva presuppone che si stia usando 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 Abramo Hashimi descrive un approccio di questo tipo in Come portare 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 contentPath di Web Deploy. Il provider contentPath supporta sia percorsi di directory fisici che percorsi di applicazioni o siti Web IIS, che lo rendono la scelta ideale per la sincronizzazione di un file tra una cartella di 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 App_offline
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 .
Nell'elemento Project radice creare un nuovo elemento PropertyGroup per archiviare le variabili per la distribuzione App_offline :
<PropertyGroup> <AppOfflineTemplateFilename Condition=" '$(AppOfflineTemplateFilename)'=='' "> app_offline-template.htm </AppOfflineTemplateFilename> <AppOfflineSourcePath Condition=" '$(AppOfflineSourcePath)'==''"> $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename) </AppOfflineSourcePath> </PropertyGroup>La proprietà SourceRoot viene 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 .
Il provider contentPath non accetterà percorsi di file relativi, quindi è necessario ottenere un percorso assoluto per il file di origine prima di poterlo distribuire. A tale scopo, è possibile utilizzare l'attività ConvertToAbsolutePath .
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-template nella cartella del progetto.
<Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline"> <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)"> <Output TaskParameter="AbsolutePaths" PropertyName="AppOfflineAbsoluteSourcePath" /> </ConvertToAbsolutePath> </Target>Questo obiettivo prende il percorso relativo al file App_offline-template nella cartella del progetto e lo salva in una nuova proprietà come percorso file assoluto. L'attributo BeforeTargets specifica che si vuole eseguire questa destinazione prima della destinazione DeployAppOffline , che verrà creata nel passaggio successivo.
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>In questo esempio la proprietà ContactManagerIisPath viene definita altrove nel file di progetto. Si tratta semplicemente di un percorso dell'applicazione IIS, nel formato [Nome sito Web IIS]/[Nome applicazione]. L'inclusione di una condizione nella destinazione consente agli utenti di attivare o disattivare la distribuzione App_offline modificando un valore della proprietà o fornendo un parametro della riga di comando.
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>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. Nel file Publish.proj , ad esempio, la proprietà FullPublishDependsOn specifica un elenco di destinazioni che devono essere eseguite in ordine quando viene richiamata la destinazione predefinita FullPublish .
Modificare il file di progetto MSBuild per richiamare le destinazioni DeployAppOffline e DeleteAppOffline nei punti appropriati del 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 modalità di 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 attivo 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 sono state seguite le attività precedenti in questo argomento, sarà stato aggiunto il fileApp_offline.htm al progetto dell'applicazione Web con un nome di file diverso (usato App_offline-template.htm) e l'azione di compilazione sarà impostata su Nessuno. Queste modifiche sono necessarie per impedire che il file interferisca con lo sviluppo e il debug. Di conseguenza, è necessario personalizzare il processo di creazione pacchetti per assicurarsi che il fileApp_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 generali:
Creare un file di progetto personalizzato denominato [nome progetto].wpp.targets nella stessa cartella del file di progetto.
Annotazioni
Il file con estensione wpp.targets deve trovarsi nella stessa cartella del file di progetto dell'applicazione Web, ad esempio ContactManager.Mvc.csproj, anziché nella stessa cartella dei file di progetto personalizzati usati per controllare il processo di compilazione e distribuzione.
Nel file .wpp.targets, creare una nuova destinazione MSBuild che viene eseguita prima della destinazione CopyAllFilesToSingleFolderForPackage. Questo è l'obiettivo WPP che compila un elenco di elementi da includere nel pacchetto.
Nella nuova destinazione creare un elemento ItemGroup .
Nell'elemento ItemGroup aggiungere un elemento FilesForPackagingFromProject e specificare il fileApp_offline.htm .
Il file con estensione 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 con estensione wpp.targets a un progetto di applicazione Web.
Per aggiungere un file con estensione wpp.targets a un pacchetto di distribuzione Web
Aprire la soluzione in Visual Studio 2010.
Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto dell'applicazione Web, ad esempio ContactManager.Mvc, scegliere Aggiungi e quindi fare clic su Nuovo elemento.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare il modello di file XML .
Nella casella Nome digitare [nome progetto].wpp.targets (ad esempio , ContactManager.Mvc.wpp.targets) e quindi fare clic su Aggiungi.
Annotazioni
Se si aggiunge un nuovo elemento al nodo radice di un progetto, il file viene creato nella stessa cartella del file di progetto. Per verificarlo, aprire la cartella in Esplora file.
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>Salvare e chiudere il file [nome progetto].wpp.targets .
Alla successiva compilazione e creazione del pacchetto del progetto dell'applicazione Web, il WPP rileverà automaticamente il file .wpp.targets . Il file App_offline-template.htm verrà incluso nel pacchetto di distribuzione Web risultante come App_offline.htm.
Annotazioni
Se la distribuzione non riesce, il file diApp_offline.htm rimarrà attivo e l'applicazione rimarrà offline. Si tratta in genere del comportamento desiderato. Per riportare l'applicazione online, è possibile eliminare il fileApp_offline.htm dal server Web. In alternativa, se si corregge qualsiasi errore ed si esegue una distribuzione corretta, il fileApp_offline.htm verrà rimosso.
Conclusione
In questo argomento è stato descritto come portare offline un'applicazione Web per la durata di una distribuzione pubblicando un fileApp_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 pacchetti di progetti di applicazioni 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 al file di progetto MSBuild descritto in queste esercitazioni, sarà necessario usare un approccio leggermente diverso per portare l'applicazione offline durante il processo di pubblicazione.