.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
相关产品推荐
相关产品推荐

