与Microsoft Unity异步/等待

时间:2015-05-13 11:01:43

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

我有一个使用Microsoft Unity和Web API 2的项目。它运行良好,没有任何问题。但是,当我尝试使用async / await

public async Task<IHttpActionResult> Post(PackageOrderDto dto)
{
    try
    {
        newOrderNumber = await _apiPlaceOrder.Save(dto));
    }
    catch (ApiValidationFailedException apiValidationFailedException)
    {
        return BadRequest(apiValidationFailedException);
    }
    return Ok("VF" + newOrderNumber);
}

我收到一条带有此消息的ResolutionFailedException:

例外是:

  

InvalidOperationException - PerRequestLifetimeManager只能是   在HTTP请求的上下文中使用。导致此错误的可能原因   在非ASP.NET应用程序上使用生命周期管理器,或使用   它在一个与相关的线程无关的线程中   同步上下文。

使用UnityHierarchicalDependencyResolver管理ApiPlaceOrder

当不使用async / await时,代码工作正常。

任何想法如何让Unity与async / await玩得很好?

我已经删除了_apiPlaceOrder.Save(...)的代码,然后回到此处尝试隔离问题,我仍然遇到同样的问题:

public class ApiPlaceOrder
{
    public async Task<int> Save(PackageOrderDto dto)
    {
        await Task.Delay(10000);
        return 1;
    }
}

1 个答案:

答案 0 :(得分:1)

在Unity.Mvc项目中使用PerRequestLifetimeManager并且HttpContext.Currentnull时,您将收到此错误消息。当您不再处于http请求的原始线程时,就会发生这种情况。

检查您的代码是否出现await fooTask.ConfigureAwait(false)或正在创建新线程或从线程池获取线程的任何事件。连接调试器并将HttpContext.Current放入监视窗口并逐步执行代码,直到该属性切换为null