Razor-Dateikompilierung in ASP.NET Core
Razor-Dateien mit der Erweiterung .cshtml
werden sowohl zur Build- als auch zur Veröffentlichungszeit mit dem Razor SDK kompiliert. Die Kompilierung zur Laufzeit kann durch Konfigurieren des Projekts optional aktiviert werden.
Hinweis
Für die Laufzeitkompilierung gilt Folgendes:
- Sie wird für Razor-Komponenten von Blazor-Apps nicht unterstützt.
- Sie unterstützt keine globalen using-Anweisungen.
- Sie unterstützt keine impliziten using-Anweisungen.
- Sie deaktiviert .NET Hot Reload.
- Sie wird für die Entwicklung empfohlen, nicht für die Produktion.
Razor-Kompilierung
Die Kompilierung von Razor-Dateien zur Build- und Veröffentlichungszeit wird vom Razor SDK standardmäßig aktiviert. Wenn die Laufzeitkompilierung aktiviert ist, ergänzt sie die Buildzeitkompilierung, sodass Razor-Dateien aktualisiert werden können, wenn sie während der Ausführung der App bearbeitet werden.
Das Aktualisieren von Razor-Ansichten und Razor in der Entwicklung und während der Ausführung der App wird mithilfe von .NET Hot Reload ebenfalls unterstützt.
Hinweis
Wenn die Laufzeitkompilierung aktiviert ist, deaktiviert sie .NET Hot Reload. Es wird empfohlen, während der Entwicklung anstelle der Razor-Laufzeitkompilierung Hot Reload zu verwenden.
Aktivieren der Laufzeitkompilierung für alle Umgebungen
So aktivieren Sie die Laufzeitkompilierung für alle Umgebungen:
Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Rufen Sie AddRazorRuntimeCompilation in
Program.cs
auf:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages() .AddRazorRuntimeCompilation();
Bedingte Aktivierung der Laufzeitkompilierung
Die Laufzeitkompilierung kann bedingt aktiviert werden, wodurch sichergestellt wird, dass für die veröffentlichte Ausgabe Folgendes gilt:
- Es werden kompilierte Ansichten verwendet.
- Dateiüberwachungselemente in der Produktionsumgebung werden nicht aktiviert.
So aktivieren Sie die Laufzeitkompilierung nur für die Entwicklungsumgebung:
Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Rufen Sie AddRazorRuntimeCompilation in
Program.cs
auf, wenn die aktuelle Umgebung auf „Entwicklung“ festgelegt ist:var builder = WebApplication.CreateBuilder(args); var mvcBuilder = builder.Services.AddRazorPages(); if (builder.Environment.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); }
Die Kompilierung zur Laufzeit kann auch mit einer Hostingstartassembly aktiviert werden. So aktivieren Sie die Laufzeitkompilierung in der Entwicklungsumgebung für bestimmte Startprofile:
- Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Ändern Sie den Abschnitt
environmentVariables
des Startprofils inlaunchSettings.json
:Überprüfen Sie, ob
ASPNETCORE_ENVIRONMENT
auf"Development"
festgelegt ist.Legen Sie
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
auf"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
fest. Beispielsweise aktiviert die folgendelaunchSettings.json
die Laufzeitkompilierung für die StartprofileViewCompilationSample
undIIS 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" } } } }
Bei dieser Vorgehensweise sind keine Codeänderungen in Program.cs
erforderlich. Zur Laufzeit sucht ASP.NET Core nach einem HostingStartup-Attribut auf Assemblyebene in Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
. Das HostingStartup
-Attribut gibt den Code an, der zum Starten der App ausgeführt werden soll, und dieser Startcode aktiviert die Laufzeitkompilierung.
Aktivieren der Laufzeitkompilierung für eine Razor-Klassenbibliothek
Stellen Sie sich ein Szenario vor, in dem ein Razor-Pages-Projekt auf eine Razor-Klassenbibliothek (RCL) mit dem Namen MyClassLib verweist. Die RCL enthält eine _Layout.cshtml
-Datei, die von MVC und Razor Pages-Projekten genutzt wird. Um die Laufzeitkompilierung für die _Layout.cshtml
-Datei in dieser RCL zu aktivieren, ändern Sie das Razor Pages-Projekt folgendermaßen:
Aktivieren Sie die Laufzeitkompilierung mithilfe der Anweisungen unter Bedingte Aktivierung der Laufzeitkompilierung.
Konfigurieren Sie 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)); });
Der obige Code erstellt einen absoluten Pfad zur RCL MyClassLib. Die PhysicalFileProvider-API wird verwendet, um Verzeichnisse und Dateien in diesem absoluten Pfad zu finden. Schließlich wird die
PhysicalFileProvider
-Instanz zur Sammlung eines Dateianbieters hinzugefügt, was Zugriff auf die.cshtml
-Dateien der RCL ermöglicht.
Zusätzliche Ressourcen
Razor-Dateien mit der Erweiterung .cshtml
werden sowohl zur Build- als auch zur Veröffentlichungszeit mit dem Razor SDK kompiliert. Die Laufzeitkompilierung kann optional durch Konfigurieren Ihres Projekts aktiviert werden.
Razor-Kompilierung
Die Kompilierung von Razor-Dateien zur Build- und Veröffentlichungszeit wird vom Razor SDK standardmäßig aktiviert. Wenn die Laufzeitkompilierung aktiviert ist, ergänzt sie die Buildzeitkompilierung, sodass Razor-Dateien aktualisiert werden können, wenn sie bearbeitet wurden.
Aktivieren der Laufzeitkompilierung bei der Projekterstellung
Die Razor Pages- und MVC-Projektvorlagen enthalten eine Option zum Aktivieren der Laufzeitkompilierung beim Erstellen des Projekts. Diese Option wird in ASP.NET Core Version 3.1 und höher unterstützt.
Gehen Sie im Dialogfeld Neue ASP.NET Core-Webanwendung erstellen folgendermaßen vor:
- Wählen Sie die Projektvorlage Webanwendung oder Webanwendung (Model View Controller) aus.
- Aktivieren Sie das Kontrollkästchen Razor-Laufzeitkompilierung aktivieren.
Aktivieren der Laufzeitkompilierung in einem vorhandenen Projekt
So aktivieren Sie die Laufzeitkompilierung für alle Umgebungen in einem vorhandenen Projekt:
Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Aktualisieren Sie die
Startup.ConfigureServices
-Methode des Projekts so, dass diese einen Aufruf von AddRazorRuntimeCompilation enthält. Beispiel:public void ConfigureServices(IServiceCollection services) { services.AddRazorPages() .AddRazorRuntimeCompilation(); // code omitted for brevity }
Bedingtes Aktivieren der Laufzeitkompilierung in einem vorhandenen Projekt
Die Laufzeitkompilierung kann so aktiviert werden, dass sie nur für die lokale Entwicklung verfügbar ist. Eine bedingte Aktivierung auf diese Weise stellt für die veröffentlichte Ausgabe Folgendes sicher:
- Es werden kompilierte Ansichten verwendet.
- Dateiüberwachungselemente in der Produktionsumgebung werden nicht aktiviert.
So aktivieren Sie die Laufzeitkompilierung nur für die Entwicklungsumgebung:
- Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Ändern Sie den Abschnitt
environmentVariables
des Startprofils inlaunchSettings.json
:- Vergewissern Sie sich, dass
ASPNETCORE_ENVIRONMENT
auf"Development"
festgelegt ist. - Legen Sie
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
auf"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
fest.
- Vergewissern Sie sich, dass
Im folgenden Beispiels ist die Laufzeitkompilierung in der Entwicklungsumgebung für die Startprofile IIS Express
und RazorPagesApp
aktiviert:
{
"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"
}
}
}
}
Es sind keine Codeänderungen in der Startup
-Klasse des Projekts erforderlich. Zur Laufzeit sucht ASP.NET Core nach einem HostingStartup-Attribut auf Assemblyebene in Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
. Das Attribut HostingStartup
gibt den Code an, der zum Starten der App ausgeführt werden soll. Dieser Startcode aktiviert die Laufzeitkompilierung.
Aktivieren der Laufzeitkompilierung für eine Razor-Klassenbibliothek
Stellen Sie sich ein Szenario vor, in dem ein Razor-Pages-Projekt auf eine Razor-Klassenbibliothek (RCL) mit dem Namen MyClassLib verweist. Die RCL enthält eine _Layout.cshtml
-Datei, die von allen MVC- und Razor Pages-Projekten Ihres Teams genutzt wird. Sie möchten die Laufzeitkompilierung für die Datei _Layout.cshtml
in dieser RCL aktivieren. Ändern Sie das Razor Pages-Projekt folgendermaßen:
Aktivieren Sie die Laufzeitkompilierung anhand der Anweisungen in Bedingtes Aktivieren der Laufzeitkompilierung in einem vorhandenen Projekt.
Konfigurieren Sie die Optionen für die Laufzeitkompilierung 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)); }); }
Im obigen Code wird ein absoluter Pfad zur RCL MyClassLib erstellt. Die PhysicalFileProvider-API wird verwendet, um Verzeichnisse und Dateien in diesem absoluten Pfad zu finden. Schließlich wird die
PhysicalFileProvider
-Instanz zur Sammlung eines Dateianbieters hinzugefügt, was Zugriff auf die.cshtml
-Dateien der RCL ermöglicht.