ASP.NET Core 5 Beta无法找到Pages下index.cshtml的404问题求助
问题描述
我正尝试将旧Web应用升级至带Razor Pages的ASP.NET Core 5 Beta,验证配置时出现404错误,无法找到Pages目录下已配置的index.cshtml文件。以下是我的Startup.cs代码,怀疑配置有误,恳请提供解决思路,谢谢。
我的Startup.cs代码
public class Startup { public static IConfigurationRoot Configuration { get; set; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var builder = new ConfigurationBuilder() .SetBasePath(System.IO.Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); services.AddDbContext<GolfGameContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"), x => { x.UseNetTopologySuite(); x.EnableRetryOnFailure(); } )); services.AddElmah<SqlErrorLog>(options => { options.ConnectionString = Configuration.GetConnectionString("DefaultConnection"); }); services.AddDefaultIdentity<AspNetUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<GolfGameContext>(); services.AddScoped<UserManager<AspNetUser>>(); services.AddScoped<SignInManager<AspNetUser>>(); services.Configure<IdentityOptions>(options => { // Password settings options.Password.RequireDigit = true; options.Password.RequiredLength = 8; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = true; options.Password.RequireLowercase = false; options.Password.RequiredUniqueChars = 6; // Lockout settings options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); options.Lockout.MaxFailedAccessAttempts = 10; options.Lockout.AllowedForNewUsers = true; // User settings options.User.RequireUniqueEmail = false; }); services.ConfigureApplicationCookie(options => { // Cookie settings options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromDays(150); options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Logout"; options.AccessDeniedPath = "/Account/AccessDenied"; options.SlidingExpiration = true; }); services.AddMvc().AddRazorPagesOptions(options => { }); services.AddAuthorization(options => { }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseStaticFiles(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllers(); }); app.UseElmah(); } }
排查与解决思路
我仔细看了你的Startup配置,发现几个可能导致Razor Pages返回404的关键点,咱们一步步来排查:
1. 替换AddMvc()为AddRazorPages()
在ASP.NET Core 5中,如果你主要使用Razor Pages,推荐直接用services.AddRazorPages()替代services.AddMvc().AddRazorPagesOptions(...)。AddMvc()虽然包含Razor Pages支持,但会额外引入MVC控制器的路由逻辑,可能会干扰Pages的默认路由匹配。
修改这行代码:
services.AddMvc().AddRazorPagesOptions(options => { });
改为:
services.AddRazorPages(options => { });
2. 检查Pages目录结构与文件属性
- 确认
index.cshtml(及对应的代码后置文件index.cshtml.cs如果存在)确实放在项目根目录的Pages文件夹下,Razor Pages默认只会扫描这个目录下的页面文件。 - 右键点击
index.cshtml,查看属性,确保复制到输出目录设置为如果较新则复制或始终复制,避免运行时文件未被正确包含。
3. 显式配置默认路由(可选)
如果默认路由没有自动匹配,你可以在AddRazorPagesOptions里显式将根路径映射到Index页面:
services.AddRazorPages(options => { options.Conventions.AddPageRoute("/Index", ""); });
这会强制把/路径绑定到Pages/Index.cshtml,覆盖默认路由规则。
4. 验证中间件顺序
你的Configure方法里的中间件顺序是符合ASP.NET Core规范的:UseStaticFiles → UseHttpsRedirection → UseRouting → UseAuthentication → UseAuthorization → UseEndpoints,这点不用调整。不过要注意UseElmah()放在UseEndpoints之后是正确的,不会影响路由匹配。
5. 检查Area配置(若适用)
如果你的Pages放在某个Area目录下,需要在路由配置中添加Area支持,但从你的代码看没有使用Area,这条可以暂时忽略。
先尝试前两个步骤,大部分情况下就能解决404问题。如果还是不行,打开开发环境的DeveloperExceptionPage,查看路由匹配失败的详细日志,能帮你进一步定位问题。
内容的提问来源于stack exchange,提问作者Wallace B. McClure

