.NET Core 3.1升级.NET 6后启动抛出InvalidOperationException异常求助
解决.NET 6升级后"Can't compile a NewExpression with a constructor declared on an abstract class"异常
常见排查方向及修复方案
1. 适配AspNetCoreRateLimit版本
.NET 6对依赖注入逻辑有细节调整,旧版本的AspNetCoreRateLimit可能存在兼容性问题。请确保安装的是支持.NET 6的版本(至少v4.x及以上),通过NuGet包管理器更新该库即可。
2. 检查Startup.cs中的服务注册代码
异常核心是代码尝试实例化抽象类,大概率出现在限流服务的配置环节。需注意:
- 禁止直接注册抽象类的构造函数,必须关联对应的具体实现类
- 排查是否存在
AddSingleton<AbstractType>()这类未指定实现的错误注册方式
以AspNetCoreRateLimit为例,正确的注册示例如下:
using AspNetCoreRateLimit; public void ConfigureServices(IServiceCollection services) { // 加载限流配置项 services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting")); services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies")); // 注册限流所需的具体实现服务 services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>(); // 其他Web API服务配置 services.AddControllers(); }
3. 验证Program.cs的宿主构建逻辑
如果保留了Startup.cs的传统模式(未改用.NET 6顶级语句),需确保CreateHostBuilder的配置逻辑无错误注入:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
若已切换为顶级语句模式,同样要检查DI注册环节是否存在抽象类实例化的问题。
4. 排查自定义服务与中间件
如果项目中有自定义的抽象类服务,检查是否存在services.AddScoped<IAbstractService>()这类缺失具体实现的注册,必须修正为services.AddScoped<IAbstractService, ConcreteService>()的形式。
内容的提问来源于stack exchange,提问作者The Duy
相关产品推荐
相关产品推荐

