Razor 页面运行时编译不起作用

Razor Page Runtime Compilation not working

我正在尝试让 Razor 运行时编译在 Razor 页面的 MVC Core 3.1 Web 应用程序中工作,但它对我不起作用。这令人沮丧,因为我有几个以前的 MVC Core Web 应用程序跨多个版本(2.0、2.1、3.1)使用按预期工作的控制器和视图。

什么不起作用?

发布项目时,我希望在发布输出中看到一个 /pages 文件夹和我的 .cshtml 文件。没有,发布文件夹中的任何位置都没有 .cshtml 文件。

什么有效?

该网站工作正常,按预期提供页面,因此页面被正确编译到 WebApplication3.1.Views.dll 程序集中。这里没有问题。

我尝试了什么?

为了重现,我按照 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.1&tabs=visual-studio 中的说明创建了一个新的 MVC 项目,并在创建时启用了 Razor 运行时编译。我可以确认 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.dll 程序集存在于已发布的输出中,并且 services.AddRazorPages().AddRazorRuntimeCompilation() 是从 Startup.ConfigureServices 方法调用的。查看文档和几个 StackExchange 答案后,这应该足以启用运行时编译。 .csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>WebApplication3._1</RootNamespace>
    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.4" />
  </ItemGroup>
</Project>

然后我将 <Target> 元素添加到 .csproj 文件以将页面放入发布文件夹,这有效,但是当我部署和更改 .cshtml 文件时我得到一个异常 Microsoft.AspNetCore.Antiforgery.dll 找不到。所以我可以看到运行时编译可以工作,但是坏了。

在这一点上,这似乎比它应该的更复杂,考虑到在我的其他基于 MVC Core 3.1 controller/view 的项目中 它只是工作。 我我错过了一些非常明显的东西?

我还查看了其他 StackExchange 问题,尤其是这个问题,但它基本上说的是同一件事:

我正在使用Visual Studio2019专业版16.6.4

您似乎需要 RazorCompileOnPublish 属性,您可以在 .csproj 文件中进行设置:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <RazorCompileOnPublish>false</RazorCompileOnPublish>
    ...
  </PropertyGroup>

  ...
</Project>

RazorCompileOnPublish 设置为 false 应该是所有需要的,但我怀疑您不需要 CopyRefAssembliesToPublishDirectory 属性 在您的 .csproj.