【问题标题】:ObjectDisposedException in async ASP.NET Web API method with Autofac使用 Autofac 的异步 ASP.NET Web API 方法中的 ObjectDisposedException
【发布时间】:2016-01-23 13:53:28
【问题描述】:

在异步 ASP.NET Web API 方法中通过 Autofac 注入的对象的延迟实例化期间,我收到 ObjectDisposedException(无法解析实例,并且无法从此 LifetimeScope 创建嵌套生命周期,因为它已被释放)。

这是 Web API 方法:

Lazy<PrintHubSender> _printHubSender;

public async void Print(Guid orderId)
{
    var order = await _orderNoSqlDbRepository.GetSingleAsync(o => o.Id == orderId);
    _printHubSender.Value.PrintOrder(order); // This triggers the exception
}

Lazy 实例是通过 Web API 控制器构造函数注入的。 Autofac注册如下:

Type hubSender = ...
containerBuilder.RegisterType(hubSender)
    .AsSelf()
    .PropertiesAutowired()
    .InstancePerRequest();

如果 ASP.NET Web API 方法不是异步的,则不会发生异常。

【问题讨论】:

    标签: c# asp.net-web-api async-await autofac


    【解决方案1】:

    Web API 引擎不知道方法是否为async,因为async 是一个编译时概念。

    引擎知道的是一个方法是否返回一个Task派生值。

    除了事件处理程序或方法调用完成不重要的任何其他 API 之外,async 等效于 voidTask,因为 async 等效于 T 是 @987654329 @。

    试试这个:

    public async Task Print(Guid orderId)
    {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 2020-02-07
      • 2017-07-19
      • 2011-08-28
      • 2015-03-30
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多