Razor compilazione di file in ASP.NET Core
Razori file con estensione .cshtml
vengono compilati sia in fase di compilazione che in fase di pubblicazione usando l'SDKRazor. La compilazione in fase di esecuzione può essere abilitata facoltativamente configurando il progetto.
Nota
Compilazione in fase di esecuzione:
- Non è supportato per Razor i componenti delle Blazor app.
- Non supporta le direttive using globali.
- Non supporta direttive using implicite.
- Disabilita i Ricaricamento rapido .NET.
- È consigliabile per lo sviluppo, non per la produzione.
Razor compilazione
La compilazione in fase di compilazione e la compilazione in fase di pubblicazione dei Razor file è abilitata per impostazione predefinita dall'SDK Razor . Se abilitata, la compilazione in fase di esecuzione integra la compilazione in fase di compilazione, consentendo Razor l'aggiornamento dei file se vengono modificati durante l'esecuzione dell'app.
L'aggiornamento delle Razor visualizzazioni e Razor delle pagine durante lo sviluppo durante l'esecuzione dell'app è supportato anche tramite .NET Ricaricamento rapido.
Nota
Se abilitata, la compilazione di runtime disabilita .NET Ricaricamento rapido. È consigliabile usare Ricaricamento rapido anziché la compilazione in fase di Razor esecuzione durante lo sviluppo.
Abilitare la compilazione in fase di esecuzione per tutti gli ambienti
Per abilitare la compilazione in fase di esecuzione per tutti gli ambienti:
Installare Microsoft.AspNetCore.Mvc.Razor. Pacchetto NuGet RuntimeCompilation.
Chiamare AddRazorRuntimeCompilation in
Program.cs
:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages() .AddRazorRuntimeCompilation();
Abilitare la compilazione in fase di esecuzione in modo condizionale
La compilazione in fase di esecuzione può essere abilitata in modo condizionale, in modo da garantire che l'output pubblicato:
- Usa le viste compilate.
- Non abilita i watcher di file nell'ambiente di produzione.
Per abilitare la compilazione di runtime solo per l'ambiente di sviluppo:
Installare Microsoft.AspNetCore.Mvc.Razor. Pacchetto NuGet RuntimeCompilation.
Chiamare AddRazorRuntimeCompilation quando
Program.cs
l'ambiente corrente è impostato su Sviluppo:var builder = WebApplication.CreateBuilder(args); var mvcBuilder = builder.Services.AddRazorPages(); if (builder.Environment.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); }
La compilazione in fase di esecuzione può essere abilitata anche con un assembly di avvio dell'hosting. Per abilitare la compilazione di runtime nell'ambiente di sviluppo per profili di avvio specifici:
- Installare Microsoft.AspNetCore.Mvc.Razor. Pacchetto NuGet RuntimeCompilation.
- Modificare la sezione del profilo di
environmentVariables
avvio inlaunchSettings.json
:Verificare che
ASPNETCORE_ENVIRONMENT
sia impostato su"Development"
.Impostare
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
su"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
. Ad esempio, il codice seguentelaunchSettings.json
abilita la compilazione di runtime per iViewCompilationSample
profili di avvio eIIS Express
:{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:7098", "sslPort": 44332 } }, "profiles": { "ViewCompilationSample": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7173;http://localhost:5251", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } } } }
Con questo approccio, non sono necessarie modifiche al codice in Program.cs
. In fase di esecuzione, ASP.NET Core cerca un attributo HostingStartup a livello di assembly in Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
. L'attributo HostingStartup
specifica il codice di avvio dell'app da eseguire e che il codice di avvio abilita la compilazione in fase di esecuzione.
Abilitare la compilazione in fase di esecuzione per una libreria di Razor classi
Si consideri uno scenario in cui un Razor progetto Pages fa riferimento a una Razor libreria di classi (RCL) denominata MyClassLib. L'RCL contiene un _Layout.cshtml
file utilizzato dai progetti MVC e Razor Pages. Per abilitare la compilazione di runtime per il _Layout.cshtml
file in tale RCL, apportare le modifiche seguenti nel Razor progetto Pages:
Abilitare la compilazione di runtime con le istruzioni riportate in Abilitare la compilazione in fase di esecuzione in modo condizionale.
Configurare MvcRazorRuntimeCompilationOptions in
Program.cs
:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options => { var libraryPath = Path.GetFullPath( Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib")); options.FileProviders.Add(new PhysicalFileProvider(libraryPath)); });
Il codice precedente compila un percorso assoluto per la libreria RCL MyClassLib . L'API PhysicalFileProvider viene usata per individuare directory e file in tale percorso assoluto. Infine, l'istanza
PhysicalFileProvider
viene aggiunta a una raccolta di provider di file, che consente l'accesso ai file rcl.cshtml
.
Risorse aggiuntive
Razori file con estensione .cshtml
vengono compilati sia in fase di compilazione che in fase di pubblicazione usando l'SDKRazor. La compilazione in fase di esecuzione può essere abilitata facoltativamente configurando il progetto.
Razor compilazione
La compilazione in fase di compilazione e la compilazione in fase di pubblicazione dei Razor file è abilitata per impostazione predefinita dall'SDK Razor . Se abilitata, la compilazione in fase di esecuzione integra la compilazione in fase di compilazione, consentendo Razor l'aggiornamento dei file se vengono modificati.
Abilitare la compilazione in fase di esecuzione alla creazione del progetto
I Razor modelli di progetto Pages e MVC includono un'opzione per abilitare la compilazione di runtime al momento della creazione del progetto. Questa opzione è supportata in ASP.NET Core 3.1 e versioni successive.
Nella finestra di dialogo Crea una nuova applicazione Web di ASP.NET Core:
- Selezionare il modello di progetto Applicazione Web o Applicazione Web (Model-View-Controller).
- Selezionare la casella di controllo Abilita Razor compilazione runtime.
Abilitare la compilazione in fase di esecuzione in un progetto esistente
Per abilitare la compilazione di runtime per tutti gli ambienti in un progetto esistente:
Installare Microsoft.AspNetCore.Mvc.Razor. Pacchetto NuGet RuntimeCompilation.
Aggiornare il metodo
Startup.ConfigureServices
del progetto per includere una chiamata a AddRazorRuntimeCompilation. Ad esempio:public void ConfigureServices(IServiceCollection services) { services.AddRazorPages() .AddRazorRuntimeCompilation(); // code omitted for brevity }
Abilitare in modo condizionale la compilazione di runtime in un progetto esistente
La compilazione in fase di esecuzione può essere abilitata in modo che sia disponibile solo per lo sviluppo locale. L'abilitazione condizionale in questo modo garantisce che l'output pubblicato:
- Usa le viste compilate.
- Non abilita i watcher di file nell'ambiente di produzione.
Per abilitare la compilazione di runtime solo nell'ambiente di sviluppo:
- Installare Microsoft.AspNetCore.Mvc.Razor. Pacchetto NuGet RuntimeCompilation.
- Modificare la sezione del profilo
environmentVariables
di avvio inlaunchSettings.json
:- Verificare
ASPNETCORE_ENVIRONMENT
che sia impostato su"Development"
. - Impostare
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
su"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
.
- Verificare
Nell'esempio seguente la compilazione di runtime è abilitata nell'ambiente di sviluppo per i IIS Express
profili di avvio e RazorPagesApp
:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:57676",
"sslPort": 44364
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
},
"RazorPagesApp": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
}
}
}
}
Non sono necessarie modifiche al codice nella classe del Startup
progetto. In fase di esecuzione, ASP.NET Core cerca un attributo HostingStartup a livello di assembly in Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
. L'attributo HostingStartup
specifica il codice di avvio dell'app da eseguire. Il codice di avvio abilita la compilazione in fase di esecuzione.
Abilitare la compilazione in fase di esecuzione per una libreria di Razor classi
Si consideri uno scenario in cui un Razor progetto Pages fa riferimento a una Razor libreria di classi (RCL) denominata MyClassLib. L'RCL contiene un _Layout.cshtml
file usato da tutti i progetti MVC e Razor Pages del team. Si vuole abilitare la compilazione di runtime per il _Layout.cshtml
file in tale RCL. Apportare le modifiche seguenti nel Razor progetto Pages:
Abilitare la compilazione in fase di esecuzione con le istruzioni riportate in Abilitare in modo condizionale la compilazione di runtime in un progetto esistente.
Configurare le opzioni di compilazione di runtime in
Startup.ConfigureServices
:public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.Configure<MvcRazorRuntimeCompilationOptions>(options => { var libraryPath = Path.GetFullPath( Path.Combine(HostEnvironment.ContentRootPath, "..", "MyClassLib")); options.FileProviders.Add(new PhysicalFileProvider(libraryPath)); }); }
Nel codice precedente viene costruito un percorso assoluto dell'RCL MyClassLib . L'API PhysicalFileProvider viene usata per individuare directory e file in tale percorso assoluto. Infine, l'istanza
PhysicalFileProvider
viene aggiunta a una raccolta di provider di file, che consente l'accesso ai file rcl.cshtml
.