ASP.NET Core 中 Razor 檔案的先行編譯

副檔名為 .cshtml 的 Razor 檔案會在使用 Razor SDK 的組建和發佈時間進行編譯。 您可以透過設定專案,選擇性地啟用執行階段編譯。

注意

執行階段編譯:

Razor 編譯

Razor SDK 預設會啟用 Razor 檔案的建置和發佈階段編譯。 啟用時,執行階段編譯可補充建置時間編譯,以允許在應用程式執行時編輯 Razor 檔案。

使用 .NET 熱重新載入也支援應用程式執行的同時,在開發期間更新 Razor 檢視和 Razor Pages。

注意

啟用時,執行階段編譯會停用 .NET 熱重新載入。 建議您在開發期間使用熱重新載入,而不是 Razor 執行階段編譯。

為所有環境啟用執行階段編譯

若要為所有環境啟用執行階段編譯:

  1. 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。

  2. Program.cs 中呼叫 AddRazorRuntimeCompilation

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    

有條件的啟用執行階段編譯

執行階段編譯可以有條件地啟用,以確保已發佈的輸出:

  • 使用編譯的檢視。
  • 不會在生產環境中啟用檔案監看員。

若要只針對開發環境啟用執行階段編譯:

  1. 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。

  2. 當目前的環境設定為 [開發] 時呼叫 Program.cs 中的 AddRazorRuntimeCompilation

    var builder = WebApplication.CreateBuilder(args);
    
    var mvcBuilder = builder.Services.AddRazorPages();
    
    if (builder.Environment.IsDevelopment())
    {
        mvcBuilder.AddRazorRuntimeCompilation();
    }
    

執行階段編譯也可以使用裝載啟動組件來啟用。 若要在特定啟動設定檔的開發環境中啟用執行階段編譯:

  1. 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
  2. launchSettings.json 中修改啟動設定檔的 environmentVariables 區段:
    • 確認 ASPNETCORE_ENVIRONMENT 設為 "Development"

    • ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 設定為 "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"。 例如,下列 launchSettings.json 會啟用 ViewCompilationSampleIIS 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"
            }
          }
        }
      }
      

使用此方法時,不需要在 Program.cs 中變更程式碼。 在執行階段中,ASP.NET Core 會在 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 中搜尋組件層級 HostingStartup 屬性。 屬性 HostingStartup 會指定要執行的應用程式啟動程式碼,且該啟動程式碼會啟用執行階段編譯。

啟用 Razor 類別庫的執行階段編譯

假設 Razor Pages 專案參考名為 MyClassLibRazor 類別庫 (RCL)。 RCL 包含 MVC 和 Razor Pages 專案所使用的 _Layout.cshtml 檔案。 若要啟用該 RCL 中 _Layout.cshtml 檔案的執行階段編譯,請在 Razor Pages 專案中進行下列變更:

  1. 使用條件式啟用執行階段編譯中的指示來啟用執行階段編譯。

  2. Program.cs 中設定 MvcRazorRuntimeCompilationOptions

    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));
    });
    

    上述程式碼會建置 MyClassLib RCL 的絕對路徑。 PhysicalFileProvider API 可用來找出位於該絕對路徑的目錄和檔案。 最後,PhysicalFileProvider 執行個體會新增至檔案提供者集合,以允許存取 RCL 的 .cshtml 檔案。

其他資源

副檔名為 .cshtml 的 Razor 檔案會在使用 Razor SDK 的組建和發佈時間進行編譯。 您可以透過設定專案,選擇性地啟用執行階段編譯。

Razor 編譯

Razor SDK 預設會啟用 Razor 檔案的建置和發佈階段編譯。 啟用時,執行階段編譯會補充建置時間編譯,以允許更新 Razor 檔案 (如果該檔案已被編輯)。

在專案建立時啟用執行階段編譯

RazorPages 和 MVC 專案範本包含一個選項,可在建立專案時啟用執行階段編譯。 此選項只有在 ASP.NET Core 3.1 和更新版本中才支援。

在 [建立新的 ASP.NET Core Web 應用程式] 對話方塊中:

  1. 選取 Web 應用程式Web 應用程式 (Model-View-Controller) 專案範本。
  2. 選取 [啟用 Razor 執行階段編譯] 核取方塊。

在現有專案中啟用執行階段編譯

若要為現有專案中的所有環境啟用執行階段編譯:

  1. 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。

  2. 更新專案的 Startup.ConfigureServices 方法以包括對 AddRazorRuntimeCompilation 的呼叫。 例如:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorRuntimeCompilation();
    
        // code omitted for brevity
    }
    

有條件的在現有專案中啟用執行階段編譯

您可以啟用執行階段編譯,使其僅適用於本機開發。 以這種方式有條件的啟用,可確保已發佈的輸出:

  • 使用編譯的檢視。
  • 不會在生產環境中啟用檔案監看員。

若要只在開發環境中啟用執行階段編譯:

  1. 安裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 套件。
  2. 修改 launchSettings.json 中的啟動設定檔 environmentVariables 區段:
    • 確認 ASPNETCORE_ENVIRONMENT 已設定為 "Development"
    • ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 設定為 "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"

在下列範例中,IIS ExpressRazorPagesApp 啟動設定檔的開發環境中會啟用執行時間編譯:

{
    "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"
        }
      }
    }
  }

專案類別 Startup 中不需要變更程式碼。 在執行階段中,ASP.NET Core 會在 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 中搜尋組件層級 HostingStartup 屬性。 屬性 HostingStartup 會指定要執行的應用程式啟動程式碼。 該啟動程式碼會啟用執行階段編譯。

啟用 Razor 類別庫的執行階段編譯

假設 Razor Pages 專案參考名為 MyClassLibRazor 類別庫 (RCL)。 RCL 包含您小組所有 MVC 和 Razor Pages 專案的 _Layout.cshtml 檔案。 您想要在該 RCL 中啟用 _Layout.cshtml 檔案的執行時間編譯。 在 Razor Pages 專案中進行下列變更:

  1. 使用條件式啟用現有專案中的執行時間編譯來啟用執行時間編譯。

  2. 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));
        });
    }
    

    在上述程式碼中,會建構 MyClassLib RCL 的絕對路徑。 PhysicalFileProvider API 可用來找出位於該絕對路徑的目錄和檔案。 最後,PhysicalFileProvider 執行個體會新增至檔案提供者集合,以允許存取 RCL 的 .cshtml 檔案。

其他資源