.NET Core 6.0集成Identity的应用启动时出现'Microsoft.AspNetCore.Mvc.MvcCoreLoggerExtensions'类型初始化异常的解决方法
MvcCoreLoggerExtensions类型初始化异常的问题 这个问题我之前也踩过坑,核心原因是NuGet包版本不匹配——具体来说是Microsoft.Extensions.Logging相关组件的版本和你的.NET 6.0 runtime/ASP.NET Core组件版本不一致,导致找不到特定的LoggerMessage.Define重载方法。下面是一步步的解决办法:
1. 统一所有ASP.NET Core相关NuGet包的版本
打开你的项目文件(.csproj),确保所有以Microsoft.AspNetCore.开头的包(包括Identity相关组件)都使用6.0.x的版本,和你的.NET 6.0 runtime完全对应。比如:
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.25" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="6.0.25" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.25" />
重点检查Microsoft.Extensions.Logging系列的包,绝对不能混用更高或更低的版本。
2. 清理并重新生成依赖
执行以下命令清理本地缓存和项目依赖,避免旧版本缓存干扰:
dotnet clean dotnet nuget locals all --clear dotnet restore
然后重新构建并运行项目:
dotnet build dotnet run
3. 排查第三方包的依赖冲突
如果你的项目使用了第三方NuGet包,有些包可能会自带旧版本的Microsoft.Extensions.Logging组件,导致版本冲突。可以用以下命令查看所有依赖的版本:
dotnet list package --include-transitive
找出版本不匹配的包,要么升级该第三方包到支持.NET 6.0的版本,要么通过项目文件的PackageReference配置排除它带来的冲突依赖。
4. 确认Program.cs配置符合.NET 6.0规范
你的Program.cs写法是兼容的,但如果上面的步骤都没解决,可以尝试改成.NET 6.0推荐的顶级语句写法,避免潜在的初始化顺序问题:
var builder = WebApplication.CreateBuilder(args); // 添加Identity等服务配置 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages(); var app = builder.Build(); // 配置中间件 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
这种类型初始化异常90%以上都是依赖版本不兼容导致的,统一版本是最关键的一步。如果还是不行,可以尝试创建一个全新的.NET 6.0集成Identity的项目,对比项目文件和依赖,找出差异点。
内容的提问来源于stack exchange,提问作者MatMar

