ASP.NET Core 5 MVC新增控制器后路由配置报TypeLoadException异常
异常原因
这个异常由两个问题共同触发:
- 新增控制器引用了错误的命名空间:你在
ExternalUrlController中引入的System.Web.Mvc是传统.NET Framework 4.x平台下ASP.NET MVC的专属命名空间,依赖System.Web程序集中的System.Web.HttpContextBase类型,而ASP.NET Core 5是跨平台重构版本,不存在这个程序集和对应类型。当框架启动扫描控制器类型时,加载到这个继承了旧版MVC基类的控制器,就会抛出类型加载失败的异常。 - 路由中间件重复注册:你在Startup中同时写了
app.UseMvc()和app.UseEndpoints()两套路由配置,UseMvc是ASP.NET Core 2.x及更早版本的路由实现,和Core 3.0+默认启用的端点路由存在冲突,会放大类型扫描时的异常问题。
修复步骤
- 修正控制器的命名空间引用:删除控制器头部的
using System.Web.Mvc;,替换为ASP.NET Core MVC的正确命名空间引用using Microsoft.AspNetCore.Mvc;,控制器内的业务逻辑不需要改动,修正后的控制器代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Solobal.Accounts.Api.Configuration; namespace Solobal.Accounts.Api.Controllers { public class ExternalUrlController : Controller { private readonly AppSettings appSettingsConfig; public ExternalUrlController(IOptions<AppSettings> options) { this.appSettingsConfig = options.Value; } public ActionResult Index() { return this.Redirect(this.appSettingsConfig.ExternalUrl); } } }
- 移除冗余的路由注册代码:删除Startup中间件配置中的
app.UseMvc();代码行,ASP.NET Core 5只需要保留UseRouting+UseEndpoints的端点路由配置即可,修正后的中间件管道代码如下:
app.UseHttpsRedirection(); app.UseWebOptimizer(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
- 清理项目:删除解决方案下的
bin、obj目录,重新生成项目,清除旧的错误编译缓存后再启动应用即可。
内容的提问来源于stack exchange,提问作者Garry A
相关产品推荐
相关产品推荐

