2015-05-13 7 views
1

У меня есть проект, который использует Microsoft Unity и Web API 2. Он отлично работает, и с ним нет проблем. Однако, когда я пытаюсь использовать асинхр/ждутAsync/Await with Microsoft Unity

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 - The PerRequestLifetimeManager можно использовать только в контексте HTTP-запрос. Возможные причины этой ошибки используют диспетчер времени жизни в приложении nonASP.NET или используют в потоке, который не связан с соответствующим контекстом синхронизации .

Управление ApiPlaceOrder осуществляется с использованием UnityHierarchicalDependencyResolver.

Код работает нормально, когда не используется асинхронный/ждущий.

Любые идеи о том, как заставить Unity поиграть с асинхронным/ждущим?

Я раздели код _apiPlaceOrder.Save(...) право вернуться к этому, чтобы попытаться изолировать проблему, и я все еще получаю один и тот же вопрос:

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

Как реализуется '_apiPlaceOrder.Save'? И где же генерируется исключение? Выполните также трассировку стека –

+0

Попробуйте использовать пакет Nuget Unitiy.WebAPI и HierarchicalLifetimeManager и UnityHierarchicalDependencyResolver вместо текущей настройки. Если это сработает, я могу дать вам объяснение. – JotaBe

+0

@JotaBe Я уже делаю обе эти вещи. Они необходимы для работы с WebAPI. – garryp

ответ

1

Вы получите эту ошибку, когда вы используете PerRequestLifetimeManager в Unity .Mvc и HttpContext.Current - null. Это произойдет, когда вы больше не находитесь в исходном потоке HTTP-запроса.

Проверьте код на наличие каких-либо вхождений await fooTask.ConfigureAwait(false) или что-то, что создает новый поток или приобретает поток из пула потоков. Подключите отладчик и положите HttpContext.Current в свое окно часов и пройдите через свой код, пока это свойство не переключится на null.