Precompilazione del sito Web (C#)

di Scott Mitchell

Visual Studio offre agli sviluppatori ASP.NET due tipi di progetti: web application projects (WAPs) e progetti di siti Web (WSP). Una delle principali differenze tra i due tipi di progetto è che i wap devono avere il codice compilato in modo esplicito prima della distribuzione, mentre il codice in un WSP può essere compilato automaticamente nel server Web. Tuttavia, è possibile precompilare un WSP prima della distribuzione. Questa esercitazione illustra i vantaggi della precompilazione e illustra come precompilare un sito Web da Visual Studio e dalla riga di comando.

Introduzione

Visual Studio offre ASP.NET sviluppatori due tipi di progetto diversi: Progetti applicazione Web (WAP) e Progetti sito Web (WSP). Una delle principali differenze tra questi tipi di progetto è che i wap richiedono la compilazione esplicita , mentre I provider di servizi di configurazione usano la compilazione automatica, per impostazione predefinita. Con i wap, il codice dell'applicazione Web viene compilato in un singolo assembly, creato nella cartella del Bin sito Web. La distribuzione comporta la copia del contenuto di markup (i .aspx.ascxfile e .master ) nel progetto, insieme all'assembly nella cartella. I file della Bin classe code-behind stessi non devono essere distribuiti. D'altra parte, i provider di servizi di configurazione vengono distribuiti copiando sia le pagine di markup che le classi code-behind corrispondenti nell'ambiente di produzione. Le classi code-behind vengono compilate su richiesta nel server Web.

Nota

Fare riferimento alla sezione "Compilazione esplicita e compilazione automatica" nell'esercitazione Determinazione dei file da distribuire per altre informazioni sulle differenze tra i modelli di progetto, la compilazione esplicita e automatica e il modo in cui il modello di compilazione influisce sulla distribuzione.

L'opzione di compilazione automatica è semplice da usare. Non esiste alcun passaggio di compilazione esplicito e devono essere distribuiti solo i file modificati, mentre la compilazione esplicita richiede la distribuzione delle pagine di markup modificate e dell'assembly appena compilato. Tuttavia, la distribuzione automatica presenta due potenziali svantaggi:

  • Poiché le pagine devono essere compilate automaticamente quando vengono visitate per la prima volta, può verificarsi un breve ritardo ma notevole quando viene richiesta una pagina ASP.NET per la prima volta dopo la distribuzione.
  • La compilazione automatica richiede che il markup dichiarativo e il codice sorgente siano presenti nel server Web. Può trattarsi di un'opzione non interessante se si prevede di vendere l'applicazione Web ai clienti che lo installeranno nei server Web.

Se uno dei due limiti precedenti è deal breaker, è possibile passare al modello WAP o precompilare il WSP prima della distribuzione. Questa esercitazione esamina le opzioni di precompilazione più adatte per un sito Web ospitato e illustra il processo di precompilazione e la distribuzione di un sito Web precompilato.

Panoramica della generazione e della compilazione del codice di ASP.NET

Prima di esaminare le opzioni di precompilazione disponibili, si esamini prima di tutto la generazione e la compilazione del codice che si verifica quando viene richiesta una pagina di ASP.NET per la prima volta dalla creazione o dall'ultimo aggiornamento. Come sapete, ASP.NET pagine sono costituite da due parti: markup dichiarativo nel .aspx file e una parte del codice sorgente, in genere in un file di classe code-behind separato (.aspx.cs). I passaggi eseguiti dal runtime quando viene richiesta una pagina di ASP.NET dipendono dal modello di compilazione dell'applicazione.

Con i wap, il codice sorgente delle pagine deve essere compilato in modo esplicito in un singolo assembly prima di essere distribuito. Durante la distribuzione, questo assembly e le varie pagine di markup vengono copiate nell'ambiente di produzione. Quando arriva una richiesta al server Web per una pagina di ASP.NET, il runtime crea un'istanza della classe code-behind della pagina e richiama il relativo ProcessRequest metodo, che avvia il ciclo di vita della pagina e, infine, genera il contenuto della pagina, che viene restituito al richiedente. Il runtime può essere usato con la classe code-behind della pagina ASP.NET perché la classe code-behind è già stata compilata in un assembly prima della distribuzione.

Con WSP e compilazione automatica, non è previsto alcun passaggio di compilazione esplicito prima della distribuzione. La distribuzione comporta invece la copia sia del contenuto dichiarativo che del contenuto del codice sorgente nell'ambiente di produzione. Quando una richiesta arriva al server Web per una pagina ASP.NET per la prima volta dalla creazione o dall'ultimo aggiornamento della pagina, il runtime deve prima compilare la classe code-behind in un assembly. Questo assembly compilato viene salvato nella cartella , anche se il percorso di questa cartella %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Filespuò essere personalizzato tramite l'elemento <compilation tempDirectory="" /> di <system.web>, in genere in Web.config. Poiché l'assembly viene salvato su disco, non deve essere ricompilato nelle richieste successive alla stessa pagina.

Nota

Come ci si aspetterebbe, si verifica un lieve ritardo quando si richiede una pagina per la prima volta (o per la prima volta dopo la modifica) in un sito che usa la compilazione automatica perché il server deve compilare il codice della pagina e salvare l'assembly risultante su disco.

In breve, con la compilazione esplicita è necessario compilare il codice sorgente del sito Web prima della distribuzione, salvando il runtime dalla necessità di eseguire tale passaggio. Con la compilazione automatica il runtime gestisce la compilazione del codice sorgente delle pagine, ma con un costo di inizializzazione leggero per la prima visita alla pagina dopo la creazione o l'ultimo aggiornamento.

Ma che ne dici della parte dichiarativa delle pagine ASP.NET (il .aspx file)? È ovvio che esiste una relazione tra i .aspx file e il codice nelle classi code-behind, perché i controlli Web definiti nel markup dichiarativo sono accessibili nel codice. È anche ovvio che il contenuto nei .aspx file influisce notevolmente sul markup sottoposto a rendering generato dalla pagina. In che modo il runtime funziona quindi con la sintassi di testo, HTML e controllo Web definita nel file per generare il contenuto di cui è stato eseguito il .aspx rendering della pagina richiesta?

Non voglio ottenere troppo sidetracked sui dettagli di implementazione di basso livello, che variano tra WAP e WSP, ma in breve il runtime genera automaticamente un file di classe che contiene i vari controlli Web come membri e metodi protetti. Questo file generato viene implementato come classe parziale alla classe code-behind corrispondente. Le classi parziali consentono di distribuire il contenuto di una singola classe tra più file. La classe code-behind viene quindi definita in due posizioni: nel .aspx.cs file creato e in questa classe generata automaticamente dal runtime. Questa classe generata automaticamente viene archiviata nella %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files cartella .

L'aspetto importante è che per il rendering di una pagina ASP.NET dal runtime sia le parti dichiarative che le parti del codice sorgente devono essere compilate in un assembly. Con i wap, il codice sorgente viene compilato in modo esplicito in un assembly prima della distribuzione, ma il markup dichiarativo deve comunque essere convertito in codice e compilato dal runtime nel server Web. Con WSP che usa la compilazione automatica, sia il codice sorgente che il markup dichiarativo devono essere compilati dal server Web.

È possibile usare la compilazione esplicita con il modello WSP. È possibile compilare in modo esplicito la parte del codice sorgente, ad esempio con il modello WAP. Inoltre, è anche possibile compilare il markup dichiarativo.

Opzioni di precompilazione

.NET Framework viene fornito con uno strumento di compilazione ASP.NET (aspnet_compiler.exe) che consente di compilare il codice sorgente (e anche il contenuto) di un'applicazione ASP.NET compilata usando il modello WSP. Questo strumento è stato rilasciato con .NET Framework versione 2.0 e si trova nella %WINDIR%\Microsoft.NET\Framework\v2.0.50727 cartella. Può essere usato dalla riga di comando o avviato da Visual Studio tramite l'opzione Pubblica sito Web del menu Compila.

Lo strumento di compilazione offre due forme generali di compilazione: precompilazione sul posto e precompilazione per la distribuzione. Con la precompilazione sul posto si esegue lo aspnet_compiler.exe strumento dalla riga di comando e si specifica il percorso della directory virtuale o del percorso fisico di un sito Web che risiede nel computer. Lo strumento di compilazione compila quindi ogni pagina ASP.NET nel progetto, archiviando la versione compilata nella %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files cartella esattamente come se le pagine fossero state visitate per la prima volta da un browser. La precompilazione sul posto può velocizzare la prima richiesta effettuata alle pagine di ASP.NET appena distribuite nel sito perché riduce il runtime dalla necessità di eseguire questo passaggio. Tuttavia, la precompilazione sul posto non è utile per la maggior parte dei siti Web ospitati perché richiede che sia possibile eseguire programmi dalla riga di comando del server Web. Negli ambienti di hosting condivisi questo livello di accesso non è consentito.

Nota

Per altre informazioni sulla precompilazione sul posto, vedere Procedura: Precompilare ASP.NET siti Web e precompilazione in ASP.NET 2.0.

Invece di compilare le pagine nel sito Web nella Temporary ASP.NET Files cartella , la precompilazione per la distribuzione compila le pagine in una directory di propria scelta e in un formato che può essere distribuito nell'ambiente di produzione.

In questa esercitazione sono disponibili due versioni di precompilazione per la distribuzione: precompilazione con un'interfaccia utente aggiornabile e precompilazione con un'interfaccia utente non aggiornabile. La precompilazione con un'interfaccia utente aggiornabile lascia il markup dichiarativo nei .aspxfile , .ascxe .master , consentendo così a uno sviluppatore di visualizzare e, se lo si desidera, modificare il markup dichiarativo nel server di produzione. La precompilazione con un'interfaccia utente non aggiornabile genera .aspx pagine che non sono vuoti di qualsiasi contenuto e rimuove .ascx e .master file, nascondendo così il markup dichiarativo e vietando a uno sviluppatore di modificarlo dall'ambiente di produzione.

Precompilazione per la distribuzione con un'interfaccia utente aggiornabile

Il modo migliore per comprendere la precompilazione per la distribuzione consiste nel vedere un esempio in azione. Precompilare il WSP Book Reviews per la distribuzione usando un'interfaccia utente aggiornabile. Lo strumento di compilazione ASP.NET può essere richiamato dal menu Compila di Visual Studio o dalla riga di comando. Questa sezione esamina l'uso dello strumento da Visual Studio; La sezione "Precompilazione dalla riga di comando" esamina l'esecuzione dello strumento del compilatore dalla riga di comando.

Aprire il WSP Revisione libro in Visual Studio, passare al menu Compila e selezionare l'opzione di menu Pubblica sito Web. Verrà avviata la finestra di dialogo Pubblica sito Web (vedere la figura 1), in cui è possibile specificare il percorso di destinazione, se l'interfaccia utente del sito precompilato è aggiornabile e altre opzioni dello strumento del compilatore. Il percorso di destinazione può essere un server Web remoto o un server FTP, ma per il momento scegliere una cartella nel disco rigido del computer. Poiché si vuole precompilare il sito con un'interfaccia utente aggiornabile, lasciare selezionata la casella di controllo "Consenti l'aggiornabilità del sito precompilato" e fare clic su OK.

Screenshot della finestra di dialogo Pubblica sito Web per specificare il percorso di destinazione.

Figura 1: Lo strumento di compilazione ASP.NET precompila il sito Web nel percorso di destinazione specificato
(Fare clic per visualizzare l'immagine a dimensione intera)

Nota

L'opzione Pubblica sito Web nel menu Compila non è disponibile in Visual Web Developer. Se si usa Visual Web Developer, è necessario usare la versione della riga di comando dello strumento di compilazione ASP.NET, descritta nella sezione "Precompilazione dalla riga di comando".

Dopo aver precompiato il sito Web, passare al percorso di destinazione immesso nella finestra di dialogo Pubblica sito Web. Confrontare il contenuto di questa cartella con il contenuto del sito Web. La figura 2 mostra la cartella del sito Web Book Reviews. Si noti che contiene entrambi i .aspx file e .aspx.cs . Si noti inoltre che la Bin directory include un solo file, Elmah.dll, che è stato aggiunto nell'esercitazione precedente

Screenshot del percorso di destinazione immesso nella finestra di dialogo Pubblica sito Web per confrontare il contenuto di questa cartella con il contenuto del sito Web.

Figura 2: La directory del progetto contiene .aspx e .aspx.cs file; la Bin cartella include solo Elmah.dll
(Fare clic per visualizzare l'immagine a dimensione intera)

La figura 3 mostra la cartella del percorso di destinazione il cui contenuto è stato creato dallo strumento di compilazione ASP.NET. Questa cartella non contiene file code-behind. Inoltre, la directory di Bin questa cartella include diversi assembly e due .compiled file oltre all'assembly Elmah.dll .

Screenshot della cartella del percorso di destinazione il cui contenuto è stato creato da A S P . Strumento di compilazione N E T.

Figura 3: La cartella Percorso di destinazione include i file per la distribuzione
(Fare clic per visualizzare l'immagine full-size)

A differenza della compilazione esplicita nei WAP, la precompilazione per il processo di distribuzione non crea un assembly per l'intero sito. Invece, esegue il batch di diverse pagine in ogni assembly. Compila anche il Global.asax file (se presente) nel proprio assembly, nonché in tutte le classi nella App_Code cartella. I file che contengono il markup dichiarativo per ASP.NET pagine Web, Controlli utente e pagine master (.aspx, .ascx.master e file, rispettivamente) vengono copiati come nella directory del percorso di destinazione. Analogamente, il Web.config file viene copiato direttamente, insieme a tutti i file statici, ad esempio immagini, classi CSS e file PDF. Per una descrizione più formale del modo in cui lo strumento di compilazione gestisce vari tipi di file, vedere Gestione file durante ASP.NET Precompilazione.

Nota

È possibile indicare allo strumento di compilazione di creare un assembly per ASP.NET pagina, controllo utente o pagina master selezionando la casella di controllo "Predefinito denominazione e assembly a pagina singola" dalla finestra di dialogo Pubblica sito Web. La compilazione di ogni pagina ASP.NET nel proprio assembly consente un controllo più granulare sulla distribuzione. Ad esempio, se è stato aggiornato un singolo ASP.NET pagina Web e necessario per distribuire tale modifica, è necessario distribuire solo il file della .aspx pagina e l'assembly associato all'ambiente di produzione. Per altre informazioni , vedere Procedura: Generare nomi fissi con lo strumento di compilazione ASP.NET .

La directory del percorso di destinazione contiene anche un file che non fa parte del progetto Web precompilato, ovvero PrecompiledApp.config. Questo file informa il runtime di ASP.NET che l'applicazione è stata precompilata e se è stata precompilata con un'interfaccia utente aggiornabile o non aggiornabile.

Infine, è necessario aprire uno dei file nel percorso di .aspx destinazione usando Visual Studio o l'editor di testo scelto. Quando si precompilazione per la distribuzione con un'interfaccia utente aggiornabile, le pagine ASP.NET nella directory del percorso di destinazione contengono lo stesso markup dei file corrispondenti nel sito Web.

Precompilazione per la distribuzione con un'interfaccia utente non aggiornabile

Lo strumento del compilatore ASP.NET può essere usato anche per precompilare un sito per la distribuzione con un'interfaccia utente non aggiornabile. La precompilazione del sito con un'interfaccia utente non aggiornabile funziona molto come la precompilazione con un'interfaccia utente aggiornabile, la differenza fondamentale è che le pagine ASP.NET, i controlli utente e le pagine master nella directory di destinazione vengono rimosse dal markup. Per precompilare un sito Web per la distribuzione con un'interfaccia utente non aggiornabile, scegliere l'opzione Pubblica sito Web dal menu Compilazione, ma deselezionare l'opzione "Consenti che il sito precompilato sia aggiornabile" (vedere La figura 4).

Screenshot dell'opzione Pubblica sito Web dal menu Build per precompilare un sito Web per la distribuzione con un'interfaccia utente non aggiornabile.

Figura 4: Deselezionare l'opzione "Consenti a questo sito precompilato di essere aggiornabile" Per precompilare con un'interfaccia utente non aggiornabile
(Fare clic per visualizzare l'immagine full-size)

La figura 5 mostra la cartella del percorso di destinazione dopo la precompilazione con un'interfaccia utente non aggiornabile.

Screenshot della cartella percorso di destinazione dopo la precompilazione con un'interfaccia utente non aggiornabile.

Figura 5: Cartella percorso di destinazione per la distribuzione con un'interfaccia utente non aggiornabile
(Fare clic per visualizzare l'immagine full-size)

Confrontare la figura 3 alla figura 5. Anche se le due cartelle possono essere identiche, si noti che la cartella dell'interfaccia utente non aggiornabile manca la pagina master, Site.master. Mentre la figura 5 include le varie pagine ASP.NET, se si visualizza il contenuto di questi file, si noterà che sono state rimosse del markup dichiarativo e sostituito con il testo segnaposto: "Questo è un file di marcatore generato dallo strumento di precompilazione e non deve essere eliminato!"

Screenshot di A S P . N E T file rimossi dal markup dichiarativo e sostituiti con il testo segnaposto.

Figura 5: Il markup dichiarativo è stato rimosso dalle pagine ASP.NET

Le Bin cartelle nella figura 3 e 5 differiscono in modo più significativo. Oltre agli assembly, la Bin cartella nella figura 5 include un .compiled file per ogni pagina ASP.NET, controllo utente e pagina master.

La precompilazione di un sito con un'interfaccia utente non aggiornabile è utile in situazioni in cui non si vuole che il contenuto delle pagine di ASP.NET venga modificato dalla persona o dall'azienda che installa o gestisce il sito Web nell'ambiente di produzione. Se si compila un'applicazione Web ASP.NET che si vende ai clienti per installare nei propri server Web, è possibile assicurarsi che non modificano l'aspetto e l'aspetto del sito modificando direttamente le .aspx pagine in cui vengono spedite. Precompilazione del sito Web con un'interfaccia utente non aggiornabile, si eseguono le pagine segnaposto come parte dell'installazione, impedendo così ai .aspx clienti di esaminare o modificare il contenuto.

Precompilazione dalla riga di comando

Dietro le quinte, la finestra di dialogo Pubblica sito Web di Visual Studio richiama lo strumento di compilazione ASP.NET (aspnet_compiler.exe) per precompilare il sito Web. In alternativa, è possibile richiamare questo strumento dalla riga di comando. In effetti, se si usa Visual Web Developer, sarà necessario eseguire lo strumento del compilatore dalla riga di comando, poiché il menu Build di Visual Web Developer non include l'opzione Pubblica sito Web.

Per usare lo strumento del compilatore dalla riga di comando, iniziare eliminando la riga di comando e passando alla directory del framework, %WINDIR%\Microsoft.NET\Framework\v2.0.50727. Immettere quindi l'istruzione seguente nella riga di comando:

aspnet_compiler -p "physical_path_to_app" -v / -f -u "target_location_folder"

Il comando precedente avvia lo strumento del compilatore ASP.NET (aspnet_compiler.exe) e, tramite l'opzione -p , indica di precompilare il sito Web radicato in physical_path_to_app. Questo valore sarà simile C:\MySites\BookReviewsa , e deve essere delimitato da virgolette.

L'opzione -v specifica la directory virtuale del sito. Se il sito è registrato come sito Web predefinito nella metabase IIS, è possibile omettere l'opzione -p e specificare solo la directory virtuale dell'applicazione. Se si usa l'opzione -p , il valore che procede l'opzione -v indica la radice del sito Web e viene usato per risolvere i riferimenti radice dell'applicazione. Ad esempio, se si specifica un valore di -v /MySite riferimenti nell'applicazione da ~/path/file risolvere come ~/MySite/path/file. Poiché il sito Recensioni libro si trova nella directory radice dell'azienda di hosting Web che ho usato l'opzione -v /.

Se -f presente, indica allo strumento di compilazione di sovrascrivere la directory target_location_folder se esiste già. Se si omette l'opzione -f e la cartella del percorso di destinazione esiste già, lo strumento di compilazione verrà chiuso con l'errore: "errore ASPRUNTIME: la directory di destinazione non è vuota. Eliminarlo manualmente o scegliere una destinazione diversa.

L'opzione -u , se presente, informa lo strumento per creare un'interfaccia utente aggiornabile. Omettere questo passaggio per precompilare il sito con un'interfaccia utente non aggiornabile.

Infine, la target_location_folder è il percorso fisico della directory della posizione di destinazione; questo valore sarà simile C:\MySites\Output\BookReviewsa e deve essere delimitato da virgolette.

Distribuzione del sito Web precompilato

A questo punto abbiamo visto come usare lo strumento di compilazione ASP.NET per precompilare un sito Web usando sia le opzioni aggiornabili che non aggiornabili dell'interfaccia utente. Tuttavia, gli esempi finora hanno precompilato il sito Web in una cartella locale e non nell'ambiente di produzione. La buona notizia è che la distribuzione del sito Web precompilato è una brezza e può essere eseguita tramite Visual Studio o tramite un altro meccanismo di copia file, ad esempio da un client FTP autonomo.

La finestra di dialogo Pubblica sito Web (prima illustrata nella figura 1) include un'opzione percorso di destinazione, che indica dove vengono copiati i file del sito Web precompilati. Questo percorso può essere un server Web remoto o un server FTP. Immettere un server remoto in questa casella di testo precompilazione e distribuire il sito Web nel server specificato in un unico passaggio. In alternativa, è possibile precompilare il sito Web in una cartella locale e quindi copiare manualmente il contenuto di tale cartella nell'ambiente di produzione tramite FTP o altri approcci.

La distribuzione automatica del sito Web precompilato tramite la finestra di dialogo Pubblica sito Web di Visual Studio è utile per i siti semplici in cui non sono presenti differenze di configurazione tra gli ambienti di sviluppo e di produzione. Tuttavia, come indicato nell'esercitazione Common Configuration Differenze tra sviluppo e produzione, non è raro che esistano tali differenze. Ad esempio, l'applicazione Web Book Reviews usa un database diverso nell'ambiente di produzione rispetto all'ambiente di sviluppo. Quando Visual Studio pubblica il sito Web in un server remoto copia in modo cieco le informazioni sul file di configurazione nell'ambiente di sviluppo.

Per i siti con differenze di configurazione tra gli ambienti di sviluppo e di produzione, è consigliabile precompilare il sito in una directory locale, copiare i file di configurazione specifici della produzione e quindi copiare il contenuto dell'output precompilato in produzione.

Per un aggiornamento sulla copia di file dall'ambiente di sviluppo all'ambiente di produzione, vedere l'esercitazione Distribuzione del sito Web tramite un client FTP e la distribuzione del sito Web tramite Le esercitazioni di Visual Studio.

Riepilogo

ASP.NET supporta due modalità di compilazione: automatica ed esplicita. Come illustrato nelle esercitazioni precedenti, i progetti applicazione Web (WAP) usano la compilazione esplicita, mentre i progetti siti Web (WSP) usano la compilazione automatica per impostazione predefinita. Tuttavia, è possibile compilare in modo esplicito un WSP prima della distribuzione usando lo strumento di compilazione ASP.NET.

Questa esercitazione è stata dedicata alla precompilazione dello strumento di compilazione per il supporto per la distribuzione. Quando si esegue la precompilazione per la distribuzione, lo strumento di compilazione crea una cartella del percorso di destinazione, compila il codice sorgente dell'applicazione Web specificata e copia questi assembly compilati e i file di contenuto nella cartella del percorso di destinazione. Lo strumento di compilazione può essere configurato per creare un'interfaccia utente aggiornabile o non aggiornabile. Quando si esegue la precompilazione con un'opzione dell'interfaccia utente non aggiornabile, il markup dichiarativo nei file di contenuto viene rimosso. In breve, la precompilazione consente di distribuire l'applicazione basata su Progetto sito Web senza includere file di codice sorgente e con il markup dichiarativo rimosso, se necessario.

Programmazione felice!

Altre informazioni

Per altre informazioni sugli argomenti illustrati in questa esercitazione, vedere le risorse seguenti: