Owin自托管WebApi集成Autofac:生命周期Scope被提前释放问题
解决Autofac结合Windows服务与Owin自托管WebApi的生命周期Scope冲突问题
你当前的问题在于:Windows服务运行时创建的_scope同时被服务内部的Service实例和WebApi共享,而Autofac的WebApi集成会在每个请求结束后自动释放关联的LifetimeScope,这直接导致服务主Scope被提前释放,进而影响依赖该Scope的Service组件正常运行。
正确的解决思路是为WebApi创建独立的子LifetimeScope,让WebApi的请求Scope基于这个子Scope派生,这样请求结束时只会释放请求级的子Scope,不会影响服务的主Scope。
1. 修正Windows Service类
调整Scope的创建逻辑,为WebApi单独分配子Scope,避免与服务主Scope共享:
public class WinService : ServiceBase { private readonly IContainer _autofacContainer; private ILifetimeScope _serviceScope; private ILifetimeScope _webApiRootScope; private Service _service; private IDisposable _webApi; public WinService() { _autofacContainer = BuildContainer(); } protected override void OnStart(string[] args) { // 服务主Scope:仅用于托管Windows服务内部运行组件 _serviceScope = _autofacContainer.BeginLifetimeScope(); _service = _serviceScope.Resolve<IService>(); _service.Start(); // WebApi专用子Scope:作为WebApi请求Scope的父级,与服务主Scope隔离 _webApiRootScope = _autofacContainer.BeginLifetimeScope(); Startup.WebApiRootScope = _webApiRootScope; _webApi = WebApp.Start<Startup>(url: "http://localhost:8080"); } protected override void OnStop() { _service.Stop(); _webApi.Dispose(); // 先释放WebApi资源,再释放服务主Scope,避免引用冲突 _webApiRootScope.Dispose(); _serviceScope.Dispose(); } private IContainer BuildContainer() { var builder = new ContainerBuilder(); // 服务组件绑定到服务主Scope的生命周期 builder.RegisterType<Service>().As<IService>().InstancePerLifetimeScope(); // WebApi控制器默认按请求生命周期管理,由Autofac自动处理 builder.RegisterApiControllers(typeof(SomeApiController).Assembly); return builder.Build(); } }
2. 修正WebApi Startup类
基于WebApi专用的子Scope配置Autofac集成,确保请求Scope独立:
internal class Startup { internal static ILifetimeScope WebApiRootScope { private get; set; } public void Configuration(IAppBuilder appBuilder) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); config.Formatters.Remove(config.Formatters.XmlFormatter); // 基于WebApi专用Scope创建依赖解析器 var webApiResolver = new AutofacWebApiDependencyResolver(WebApiRootScope); config.DependencyResolver = webApiResolver; // 配置Owin注入WebApi的根Scope,确保每个请求生成独立的子Scope appBuilder.UseAutofacLifetimeScopeInjector(WebApiRootScope); appBuilder.UseAutofacWebApi(config); appBuilder.UseWebApi(config); } }
核心逻辑说明
- Scope层级隔离:根容器 → 服务主Scope(服务运行全程存在)、WebApi根Scope(WebApi运行全程存在) → WebApi请求Scope(每个请求创建,请求结束自动释放)
- 生命周期独立:服务内部组件依赖服务主Scope,WebApi组件依赖请求级Scope,两者完全隔离,不会互相干扰
- 资源释放顺序:停止服务时优先释放WebApi相关资源,再释放服务主Scope,避免跨Scope的资源引用异常
内容的提问来源于stack exchange,提问作者JuanDYB
相关产品推荐
相关产品推荐

