You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:52:40