.NET 7 Web API基于Autofac无法注册到Eureka的问题排查
.NET 7 Web API注册Eureka时Autofac依赖解析异常问题
问题背景
在独立.NET 7类库项目中使用Autofac配置服务注册,尝试将Web API应用注册到Eureka服务器时,出现Autofac依赖解析异常,尽管已添加Eureka相关配置。
相关代码与配置
CoreModule代码
using Project.Services.Core.Extensions; using Project.Services.Core.Utilities.IoC; using Microsoft.Extensions.DependencyInjection; using StackExchange.Redis; using System.Diagnostics; using Serilog; using Microsoft.Extensions.Configuration; using Steeltoe.Discovery.Client; using Steeltoe.Discovery.Eureka; namespace Project.Services.Core.DependencyResolvers { public class CoreModule : ICoreModule { public void Load(IServiceCollection services, IConfiguration configuration) { services.AddServiceDiscovery(o => o.UseEureka()); services.AddMemoryCache(); services.AddSingleton<ICacheManager, MemoryCacheManager>(); services.AddSingleton<IDistributedCacheManager, DistributedCacheManager>(); services.AddHttpContextAccessor(); services.AddSingleton<Stopwatch>(); } } }
Program.cs代码
builder.Services.AddDependencyResolvers(new ICoreModule[] { new CoreModule() }, builder.Configuration);
appsettings.json配置
"Spring": { "Application": { "Name": "STOCK-SERVICE" } }, "Eureka": { "Client": { "ServiceUrl": "http://localhost:867/eureka/", "ValidateCertificates": false, "ShouldRegisterWithEureka": true }, "Instance": { "NonSecurePort": 5004, "HostName": "localhost", "InstanceId": "Stock.API,Port:5004", "StatusPageUrlPath": "/swagger/index.html" } }
错误详情
Autofac.Core.DependencyResolutionException HResult=0x80131500 Message=激活 λ:Microsoft.Extensions.Hosting.IHostedService[] -> Steeltoe.Discovery.Client.DiscoveryClientService -> λ:Steeltoe.Discovery.IDiscoveryClient -> λ:Steeltoe.Discovery.Eureka.EurekaDiscoveryClient -> Steeltoe.Discovery.Eureka.EurekaApplicationInfoManager 时引发异常。 Source=Autofac StackTrace: at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) ...(省略部分栈信息) at Program.<Main>$(String[] args) DependencyResolutionException: 调用类型'EurekaApplicationInfoManager'的构造函数'Void .ctor(Microsoft.Extensions.Options.IOptionsMonitor`1[Steeltoe.Discovery.Eureka.EurekaInstanceOptions], Microsoft.Extensions.Logging.ILoggerFactory)'时引发异常。 NullReferenceException: 对象引用未设置到对象的实例。
解决方案
1. 显式绑定Eureka配置选项
在CoreModule的Load方法中,添加对Eureka配置选项的显式绑定,确保IOptionsMonitor<EurekaInstanceOptions>和IOptionsMonitor<EurekaClientOptions>被正确注入:
public void Load(IServiceCollection services, IConfiguration configuration) { // 绑定Eureka实例和客户端配置 services.Configure<EurekaInstanceOptions>(configuration.GetSection("Eureka:Instance")); services.Configure<EurekaClientOptions>(configuration.GetSection("Eureka:Client")); services.AddServiceDiscovery(o => o.UseEureka()); // 其他服务注册... services.AddMemoryCache(); services.AddSingleton<ICacheManager, MemoryCacheManager>(); services.AddSingleton<IDistributedCacheManager, DistributedCacheManager>(); services.AddHttpContextAccessor(); services.AddSingleton<Stopwatch>(); }
2. 检查Autofac集成流程
确保Program.cs中正确配置Autofac作为服务提供工厂,示例如下:
var builder = WebApplication.CreateBuilder(args); // 指定使用Autofac作为服务提供工厂 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); // 添加模块 builder.Services.AddDependencyResolvers(new ICoreModule[] { new CoreModule() }, builder.Configuration); // 其他配置... var app = builder.Build();
3. 验证Steeltoe版本兼容性
确保使用与.NET 7兼容的Steeltoe Discovery包版本(推荐3.2.x及以上),可通过NuGet包管理器检查并更新Steeltoe.Discovery.Client和Steeltoe.Discovery.Eureka包版本。
4. 检查Eureka配置正确性
- 确认Eureka服务器的
ServiceUrl端口是否正确(默认Eureka端口为8761,当前配置为867,需核对实际服务器端口) - 确保
Eureka:Instance中的配置项完整,没有缺失必要字段
内容的提问来源于stack exchange,提问作者Avora
相关产品推荐
相关产品推荐

