如何在Autofac+Service Fabric中配置端口、反向代理及环境?
解决Service Fabric + .NET Core WebAPI + Autofac配置迁移及容器注册问题
一、先解决类库与DAL的循环引用问题
- 提取DAL的抽象接口到独立共享类库(如
MyApp.DAL.Abstractions) - 目标配置类库仅依赖该抽象类库,不直接引用DAL实现
- DAL项目引用抽象类库并实现对应接口
- 最终依赖链:业务类库 → 抽象类库 ← DAL实现,彻底打破循环引用
二、Autofac结合Service Fabric Web Host的端口与ReverseProxy配置方案
针对你遇到的两个核心问题,调整Web Host创建逻辑,同时兼容Autofac容器:
1. 绑定Service Manifest定义的静态端口
通过Service Fabric的ServiceContext获取Endpoint配置,手动指定端口:
var endpoint = Context.CodePackageActivationContext.GetEndpoint("ServiceEndpoint"); var port = endpoint.Port; var webHost = new WebHostBuilder() .UseKestrel(options => options.Listen(IPAddress.Any, port)) // 其他配置项 .Build();
2. 启用ReverseProxy集成并保留环境变量配置
直接在UseServiceFabricIntegration中传入指定参数,通过ConfigureAppConfiguration加载环境变量:
var webHost = new WebHostBuilder() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { // 保留旧版本环境变量配置逻辑 config.AddEnvironmentVariables(); // 可按需添加其他配置源(如appsettings.json) }) .UseServiceFabricIntegration(Context, ServiceFabricIntegrationOptions.UseReverseProxyIntegration) .UseKestrel() .UseAutofac() // 启用Autofac集成 .UseStartup<Startup>() .Build();
3. 整合Autofac容器注册Service Fabric类型
在Startup的ConfigureContainer方法中完成注册,避免提前创建容器导致的配置缺失:
public void ConfigureContainer(ContainerBuilder builder) { // 注册业务类库、DAL实现等 builder.RegisterAssemblyTypes(typeof(MyBusinessLibrary).Assembly) .AsImplementedInterfaces() .InstancePerLifetimeScope(); // 注册Service Fabric上下文 builder.RegisterInstance(Context).As<ServiceContext>().SingleInstance(); }
替代方案:使用WebListener绑定端口(若兼容)
如果Kestrel配置仍有问题,可切换为WebListener实现:
var endpoint = Context.CodePackageActivationContext.GetEndpoint("ServiceEndpoint"); var url = $"http://+:{endpoint.Port}"; var webHost = new WebHostBuilder() .UseWebListener(options => options.ListenerSettings.UrlPrefixes.Add(url)) .UseServiceFabricIntegration(Context, ServiceFabricIntegrationOptions.UseReverseProxyIntegration) .UseAutofac() .UseStartup<Startup>() .Build();
三、完整的CreateServiceInstanceListeners示例
整合所有调整后的实现:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { var endpoint = Context.CodePackageActivationContext.GetEndpoint("ServiceEndpoint"); return new[] { new ServiceInstanceListener(serviceContext => new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => { ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}"); var webHost = new WebHostBuilder() .UseWebListener() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { config.AddEnvironmentVariables(); // 加载自定义配置 }) .UseServiceFabricIntegration(serviceContext, ServiceFabricIntegrationOptions.UseReverseProxyIntegration) .UseUrls(url) .UseAutofac() .UseStartup<Startup>() .Build(); return webHost; })) }; }
内容的提问来源于stack exchange,提问作者Cliff Chambers
相关产品推荐
相关产品推荐

