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:

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:

  1. Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. 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:

  1. Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. 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:

  1. Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Ändern Sie den Abschnitt environmentVariables des Startprofils in launchSettings.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 folgende launchSettings.json die Laufzeitkompilierung für die Startprofile ViewCompilationSample und IIS 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 (Razor Class Library, RCL) namens 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:

  1. Aktivieren Sie die Laufzeitkompilierung mithilfe der Anweisungen unter Bedingte Aktivierung der Laufzeitkompilierung.

  2. 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:

  1. Wählen Sie die Projektvorlage Webanwendung oder Webanwendung (Model View Controller) aus.
  2. 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:

  1. Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. 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:

  1. Installieren Sie das NuGet-Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Ändern Sie den Abschnitt environmentVariables des Startprofils in launchSettings.json:
    • Vergewissern Sie sich, dass ASPNETCORE_ENVIRONMENT auf "Development" festgelegt ist.
    • Legen Sie ASPNETCORE_HOSTINGSTARTUPASSEMBLIES auf "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" fest.

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 (Razor Class Library, RCL) namens 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:

  1. Aktivieren Sie die Laufzeitkompilierung anhand der Anweisungen in Bedingtes Aktivieren der Laufzeitkompilierung in einem vorhandenen Projekt.

  2. 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.

Zusätzliche Ressourcen