c# - 使用 Autofac 的异步 ASP.NET Web API 方法中的 ObjectDisposeException

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

在异步 ASP.NET Web API 方法中通过 Autofac 注入(inject)的对象的延迟实例化过程中,我收到 ObjectDisposeException(无法解析实例,并且无法从此 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 Controller 构造函数注入(inject)的。 Autofac注册如下:

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

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

最佳答案

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

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

除了事件处理程序或任何其他 API(其中方法调用的完成并不重要)之外,async相当于 voidTask作为async相当于 TTask<T> .

试试这个:

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

关于c# - 使用 Autofac 的异步 ASP.NET Web API 方法中的 ObjectDisposeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964297/

相关文章:

c# - Razor 引用未在 MVC 5 View 中解析 Visual Studio 2015 Enterprise

c# - 如何将十六进制字符串转换为普通文本字符串 C#

c# - EF SaveChanges 不保存也不抛出异常

c# - 为什么此 Controller 操作的结果为空?

c# - 异步总是 WaitingForActivation

javascript - 在解析 "await Promise"之前输入 Catch block

c# - 使用默认值检查 C# 6 中的 null

c# - 异常调用堆栈被截断而没有任何重新抛出

asp.net - Azure Web App - 限制对 API 管理的访问

c# - 每个 'await' 运算符都会产生一个状态机吗?