Questo articolo è tratto dal capitolo 14 (HttpRuntime e BuildProviders) del libro ASP.NET 2.0 per tutti di Daniele Bochicchio, Cristian Civera, Riccardo Golia e Stefano Mostarda.
Acquista la tua copia col 10% di sconto!
ASP.NET 2.0 è un motore, che sfrutta l'ambiente messo a disposizione dal .NET Framework, in grado di soddisfare qualunque richiesta proveniente dal WebServer. Non serve quindi solo richieste che si aspettano codice HTML, ma anche qualsiasi forma di testo o dato binario come immagini, documenti ecc. Conoscerne il funzionamento e tutti gli attori che agiscono nel processo di esecuzione di una richiesta, permette di apprendere meglio le funzioni specifiche delle pagine con estensione .aspx e di sfruttare il motore per tutte le esigenze che il mondo web può richiedere.
...omissis...
Generazione di codice con i BuildProviders
Nel paragrafo relativo all'HttpRuntime si è visto che nella fase di preparazione dell'applicazione, attivata alla prima richiesta, entrano in azione i BuildProviders. Questi sono generatori di codice ad alto livello (C#, VB, J#, ecc.) destinato poi ad essere compilato dal motore di ASP.NET 2.0. Lo scopo è quello di fornire degli assembly pronti ad essere eseguiti, sfruttando le capacità del .NET Framework, e di dare all'applicazione web una versatilità di elaborazione dei file che si possono inserire o togliere in qualsiasi momento.
Questi generatori sono oggetti che ereditano dalla classe astratta BuildProvider nel namespace System.Web.Compilation e lavorano in funzione dell'estensione che gli è stata associata. Un esempio è PageBuildProvider, legato all'estensione .aspx, e che è responsabile del funzionamento di parsing delle pagine visto nel capitolo 5. Caratteristiche come Themes, MasterPage, UserControls, Resources (per la localizzazione), Profile e WebService sono fornite mediante i BuildProviders che rendono di conseguenza ASP.NET 2.0 diverso da altri motori web (ASP, PHP, ecc), i quali interpretano ad ogni richiesta i file.
Come la maggior parte delle funzionalità, anche questi provider si configurano nel web.config indicando per ogni estensione il tipo da caricare (non è possibile usare un provider diverso anche per un unico path):
<system.web> <compilation> <buildProviders> <add extension=".aspx" type="System.Web.Compilation.PageBuildProvider" /> </buildProviders> </compilation> </system.web>
I BuildProvider esistono in diverse tipologie, attribuite mediante BuildProviderAppliesToAttribute con il quale decorare la classe, e differiscono nel momento in cui vengono elaborati e nelle cartelle in cui operano. Sono:
- Code: genera codice per i file presenti nella cartella speciale App_Code;
- Resources: genera codice per i file (tipicamente di risorse) presenti nelle cartelle speciali App_GlobalResources e App_LocalResources;
- Web: genera codice per tutti i file presenti nelle cartelle e sotto cartelle dell'applicazione web, ad eccezione di quelle speciali nominate in precedenza;
- All: genera codice per tutti i file presenti nelle cartelle dell'applicazione web.
Il metodo principale della classe astratta BuildProvider è GenerateCode, nel quale si deve creare la rappresentazione del codice. Per farlo il .NET Framework contiene un modello ad oggetti all'interno del namespace System.CodeDOM, indipendente dal linguaggio, volto alla generazione di codice ad alto livello. In pratica si scrive codice per produrre dell'altro codice in un'unica forma sfruttando le medesime potenzialità dell'IL. Poiché tutti i linguaggi .NET, come C#, VB, J#, Delphi, ecc., devono fornire anche un generatore che, prese queste classi, produce codice nella loro sintassi, è facile sfruttare questo meccanismo all'interno di ASP.NET 2.0 tramite i BuildProvider.
Dim mioTipo As New CodeTypeDeclaration("MiaClasse") Dim mioMetodo As New CodeMemberMethod() mioMetodo.Name = "MioMetodo" mioMetoto.ReturnType = New CodeTypeReference(GetType(String))
CodeTypeDeclaration mioTipo = new CodeTypeDeclaration("MiaClasse"); CodeMemberMethod mioMetodo = new CodeMemberMethod(); mioMetodo.Name = "MioMetodo"; mioMetoto.ReturnType = new CodeTypeReference(typeof(String));
Il codice precedente è un semplice esempio di uso di CodeDOM che, dato in pasto al VBCodeGenerator o al CSharpCodeGenerator, genera i seguenti testi:
Public Class MiaClasse Public Function MioMetodo() As String End Function End Class
public class MiaClasse { public String MioMetodo() { } }
Il linguaggio con il quale è generato il codice è stabilito in generale nella sezione di configurazione system.web/compilation/@defaultLanguage e in specifico per ogni pagina, con l'attributo language della direttiva @Page o @Control.
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare la libreria Benchmark.NET per misurare le performance
Sfruttare l'output cache di ASP.NET Core 7 con i controller
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Cache policy su route groups di Minimal API in ASP.NET Core 7
Migliorare la scalabilità di ASP.NET Core 7 grazie all'output cache
Definire la durata dell'output cache in ASP.NET Core 7
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Migrare un progetto ASP.NET Core da .NET 6 a .NET 7
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Sfruttare i tag nell'output cache di ASP.NET Core 7
Gestire la query string nell'output cache di ASP.NET Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes