You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 Blazor Server启用Razor源生成器时路由错误求助

Blazor Server .NET7 启用Razor源生成器后端点错误解决办法

问题背景

  • 环境:.NET SDK 7.0.305 x64 + 6.0.411 x64,基于Blazor Server模板创建,启用Docker、禁用HTTPS,解决方案与项目同目录
  • 现象:
    • 设置<UseRazorSourceGenerator>false</UseRazorSourceGenerator>:应用正常加载,但热重载失效
    • 设置<UseRazorSourceGenerator>true</UseRazorSourceGenerator>:启动抛出错误:
      InvalidOperationException: Cannot find the fallback endpoint specified by route values: { page: /_Host, area: }
      
      完整堆栈跟踪:
      Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DynamicPageEndpointMatcherPolicy.ApplyAsync(HttpContext httpContext, CandidateSet candidates)
      Microsoft.AspNetCore.Routing.Matching.DfaMatcher.SelectEndpointWithPoliciesAsync(HttpContext httpContext, IEndpointSelectorPolicy[] policies, CandidateSet candidateSet)
      Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.<Invoke>g__AwaitMatch|8_1(EndpointRoutingMiddleware middleware, HttpContext httpContext, Task matchTask)
      Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
      Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
      Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
      
  • 已排查:_Host.cshtml未移出Pages文件夹,尝试过Startup.cs相关方案无效

解决方案

1. 修正项目文件的Razor配置

确保项目文件中包含正确的Razor源生成器及Razor Pages依赖配置:

<PropertyGroup>
  <TargetFramework>net7.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <UseRazorSourceGenerator>true</UseRazorSourceGenerator>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="7.0.10" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="7.0.10" />
</ItemGroup>

2. 验证Program.cs端点映射顺序

对于.NET7的顶级Program.cs,必须保证Razor Pages端点映射在Blazor fallback之前,且配置完整:

var builder = WebApplication.CreateBuilder(args);

// 注册Razor Pages和Blazor服务
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

// 先映射Razor Pages端点
app.MapRazorPages();
// 再映射Blazor Hub和fallback到_Host
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

注意:MapRazorPages()必须在MapFallbackToPage("/_Host")之前执行,否则Razor Pages路由无法被正确识别。

3. 清理重建项目

  • 删除项目根目录下的bin、obj文件夹
  • 清理NuGet缓存:执行命令 dotnet nuget locals all --clear
  • 重新生成项目:dotnet build

4. 检查Docker配置(若启用Docker)

确保Dockerfile中完整复制了项目文件,尤其是Pages目录下的_Host.cshtml:

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["YourProjectName.csproj", "."]
RUN dotnet restore "./YourProjectName.csproj"
# 复制所有项目文件,包括Pages目录
COPY . .
WORKDIR "/src/."
RUN dotnet build "YourProjectName.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "YourProjectName.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "YourProjectName.dll"]

避免因Docker构建时遗漏Razor文件导致的路由问题。

5. 指定SDK运行时版本

在项目文件中明确指定.NET7的运行时版本,避免多SDK版本冲突:

<PropertyGroup>
  <TargetFramework>net7.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <UseRazorSourceGenerator>true</UseRazorSourceGenerator>
  <RuntimeFrameworkVersion>7.0.10</RuntimeFrameworkVersion>
</PropertyGroup>

内容的提问来源于stack exchange,提问作者MST

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:38:11