我有一个使用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;
}
}
答案 0 :(得分:1)
在Unity.Mvc项目中使用PerRequestLifetimeManager
并且HttpContext.Current
为null
时,您将收到此错误消息。当您不再处于http请求的原始线程时,就会发生这种情况。
检查您的代码是否出现await fooTask.ConfigureAwait(false)
或正在创建新线程或从线程池获取线程的任何事件。连接调试器并将HttpContext.Current
放入监视窗口并逐步执行代码,直到该属性切换为null
。