.NET5项目升级后启动报错:Microsoft.AspNetCore.Hosting.Server.IServer服务验证异常
异常说明
抛出的异常如下:
InvalidOperationException: 验证服务描述符'ServiceType: Microsoft.AspNetCore.Hosting.Server.IServer Lifetime: Singleton ImplementationType: Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl'时出错:无法比较数组中的两个元素。
堆栈信息:
Microsoft.Extensions.DependencyInjection.ServiceProvider.ValidateService(ServiceDescriptor descriptor) Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable<ServiceDescriptor> serviceDescriptors, ServiceProviderOptions options)
排查方向
- 检查所有Microsoft.AspNetCore.*、Microsoft.Extensions.*系列NuGet包的版本一致性,确保所有包都统一使用.NET 5对应的5.0.x版本,不存在3.x、2.x版本混用的情况
- 检查Program.cs中Kestrel服务的配置代码,旧版本的UseKestrel重载、不被.NET 5支持的配置项都会引发服务构建失败
- 检查ConfigureServices中是否存在手动注册IServer、KestrelServerImpl相关服务的代码,.NET 5的Web主机构建逻辑会自动注册Kestrel服务,重复注册不同生命周期的实现会触发验证冲突
- 确认是否开启了服务构建验证配置
ValidateOnBuild = true,该配置会在容器构建时严格校验所有服务的合法性,只要存在一个不合法的服务注册就会直接抛出异常
解决方案
统一NuGet包版本
右键解决方案选择「管理解决方案的NuGet包」,在「更新」和「已安装」标签页中合并所有Microsoft.AspNetCore、Microsoft.Extensions开头的包版本到最新的5.0.x稳定版,删除所有版本不一致的冗余包引用。修正Kestrel配置写法
替换旧版本的Kestrel配置为.NET 5兼容的写法,示例如下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(serverOpts => { // 仅保留.NET 5支持的配置项 serverOpts.ListenAnyIP(5000); serverOpts.Limits.MaxRequestBodySize = 10 * 1024 * 1024; }); webBuilder.UseStartup<Startup>(); });
删除重复的服务注册
检查Startup.cs的ConfigureServices方法,删除所有手动注册IServer、KestrelServerImpl的代码,避免和系统自动注册的服务冲突。临时关闭服务验证排查问题
如果暂时无法定位冲突点,可以先关闭服务构建验证确认是否是校验逻辑导致的问题:
Host.CreateDefaultBuilder(args) .UseDefaultServiceProvider(opts => { opts.ValidateOnBuild = false; opts.ValidateScopes = false; }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
该配置仅用于排查问题,生产环境建议开启验证以提前发现服务注册风险。
内容的提问来源于stack exchange,提问作者Israel Herrera Payano
相关产品推荐
相关产品推荐

