使用IHostBuilder引导ASP.NET Core 7应用时所有路由返回404的问题
使用IHostBuilder引导ASP.NET Core 7应用时所有路由返回404的问题
咱们来一步步拆解你代码里的问题,这些细节导致了路由无法正常匹配:
1. 配置服务时的语法错误与冗余代码
你在ConfigureServices里的代码有语法闭合问题,还重复添加了Mvc服务:
services.AddControllersWithViews().AddRazorRuntimeCompilation();后面的括号没闭合,导致代码结构混乱services.AddMvc();完全是冗余的——AddControllersWithViews()已经包含了MVC核心服务,重复添加反而可能引发服务注册冲突
2. Serilog集成方式不正确
你手动创建了SerilogLoggerFactory,但没有把Serilog真正注册到Host的日志系统中,这虽然不是404的直接原因,但会导致日志无法正常输出,不利于后续排查问题。
3. 路由配置的冗余与匹配逻辑问题
你同时注册了MapControllers、MapRazorPages和MapDefaultControllerRoute,如果你的应用是纯MVC项目,过多的路由映射可能导致匹配逻辑混乱;另外要确认你的控制器是否有对应的默认Action(比如Index)。
修正后的完整代码
using Serilog; var configuration = new ConfigurationBuilder() .AddEnvironmentVariables() .AddCommandLine(args) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json", optional: true) .Build(); // 先初始化Serilog配置 Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); try { var hostBuilder = Host.CreateDefaultBuilder(args) // 将Serilog集成到Host的日志系统 .UseSerilog() .ConfigureServices(services => { // 正确注册MVC服务,移除冗余的AddMvc() services.AddControllersWithViews() .AddRazorRuntimeCompilation(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseConfiguration(configuration); webBuilder.Configure((context, app) => { if (!context.HostingEnvironment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } // 建议添加HTTPS重定向,适配生产环境规范 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // 默认MVC路由,确保控制器有对应的Action(比如Index) endpoints.MapDefaultControllerRoute().RequireAuthorization(); // 按需保留以下路由:如果是API项目就开启MapControllers,Razor Pages项目开启MapRazorPages // endpoints.MapControllers(); // endpoints.MapRazorPages(); }); }); }); await hostBuilder.Build().RunAsync(); } catch (Exception ex) { Log.Fatal(ex, "应用启动意外终止"); } finally { Log.CloseAndFlush(); }
额外检查要点
- 确认你的控制器类继承自
Controller,并且包含public IActionResult Index()这样的默认Action,对应根路径/ - 检查
appsettings.json中ASPNETCORE_ENVIRONMENT是否设置为Development,确保开发环境配置和Razor运行时编译生效 - 核对项目结构:Controllers目录下有正确的控制器文件,Views目录有对应的视图文件(如果是MVC视图项目)
备注:内容来源于stack exchange,提问作者Alexander Zeitler
相关产品推荐
相关产品推荐

