.NET Core 6.0升级后UseMvc警告:最优方案及原理咨询
.NET Core 6.0升级后UseMvc与Endpoint Routing冲突警告解决方案
最优解决方案
直接替换旧的UseMvc()为端点路由的标准配置方式——这是.NET Core 3.0+官方推荐的路由方案,相比旧MVC路由更灵活、性能更优,也能完美适配.NET Core 6.0的架构设计。
保留Startup类的修改方式
修改原Configure方法如下:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggingBuilder builder) { builder.AddConfiguration(Configuration.GetSection("Logging")); builder.AddConsole(); builder.AddDebug(); app.UseDefaultFiles(); app.UseStaticFiles(); // 替换UseMvc()为端点路由配置 app.UseRouting(); app.UseEndpoints(endpoints => { // 配置默认MVC路由,等价于原UseMvc()的默认行为 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
.NET Core 6.0顶级Program.cs模式(推荐)
如果项目已经迁移到6.0的极简Program.cs写法,配置会更简洁:
var builder = WebApplication.CreateBuilder(args); // 添加MVC控制器与视图服务 builder.Services.AddControllersWithViews(); var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); app.Run();
为什么Endpoint Routing不需要UseMvc()
- 职责拆分更清晰:旧
UseMvc()同时包揽路由匹配和请求调度,而Endpoint Routing将这两个环节拆分为UseRouting()(路由匹配)和UseEndpoints()(请求处理)。中间件可以在路由匹配完成后、请求真正处理前,访问路由数据完成权限校验、日志埋点等操作,扩展性更强。 - 路由系统统一化:Endpoint Routing是.NET Core的统一路由框架,不仅支持MVC,还兼容Razor Pages、Web API、SignalR等所有端点类型。
UseMvc()是MVC专属的旧路由实现,已被统一方案取代。 - 配置灵活性更高:通过
UseEndpoints()可以精细化配置路由规则,比如单独为某个控制器/Action指定路由,或者混合配置多种类型的端点(如同时挂载MVC控制器和SignalR集线器)。 - 性能优化明显:Endpoint Routing的匹配逻辑经过重构优化,在多路由规则场景下,比旧MVC路由的匹配效率更高。
不推荐设置EnableEndpointRouting为false的原因
虽然关闭端点路由能快速消除警告,但这是退回到旧的MVC路由模式,会丢失Endpoint Routing带来的所有优势,包括统一路由生态、中间件集成能力、性能提升等。而且该配置属于过渡兼容方案,未来.NET版本可能会逐步移除,并非长期最优解。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

