启动集成Identity的.NET Core 6.0应用时出现System.TypeInitializationException错误的解决方法
这个问题我之前帮同事排查过,大概率是NuGet包版本不兼容搞的鬼!尤其是Microsoft.Extensions.Logging系列包和ASP.NET Core 6.0的依赖版本没对齐,才会触发找不到LoggerMessage.Define方法重载的异常。给你几个具体的解决步骤:
统一所有ASP.NET Core相关包的版本
打开你的项目文件(.csproj),把所有Microsoft.AspNetCore.*、Microsoft.Extensions.*以及Identity相关的包(比如Microsoft.AspNetCore.Identity.EntityFrameworkCore)的版本都明确指定为和.NET 6.0匹配的稳定版(比如6.0.25),绝对不要混合不同大版本的包(比如同时存在5.x和6.x的包)。举个正确的配置示例:<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.25" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="6.0.25" />清理NuGet缓存并重新还原包
有时候本地缓存的旧版本包会搞事情,打开命令行进入项目目录,执行以下命令彻底清理并重新下载正确的包:dotnet nuget locals all --clear dotnet restore检查Identity服务的配置顺序
确保在Startup.cs的ConfigureServices方法里,Identity的服务注册在AddControllers、AddRazorPages这类方法之前,比如:public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); }排查第三方包的依赖冲突
有些第三方NuGet包可能依赖了旧版本的Microsoft.Extensions.Logging,会间接导致版本冲突。你可以在Visual Studio里右键项目→管理NuGet包→“已安装”标签,查看每个包的依赖项,找到那些依赖5.x或更低版本Logging库的包,尝试更新它们到支持.NET 6的版本,或者替换为替代包。
如果以上步骤都没解决问题,建议你新建一个干净的.NET 6集成Identity的空白项目,对比它的包版本和配置,逐步迁移你的代码过去,这样能快速定位出是哪个配置或包出了问题。
内容的提问来源于stack exchange,提问作者MatMar

