2015-05-05 1 views
1

Я работаю над своей локальной средой разработки, используя угловые для вызова ajax-вызовов в Web.API (размещение IIS 8.5). Я делаю 5 звонков через различные угловые контроллерах одновременно, каждый из которых выглядит следующим образом:Почему мои запросы на web.api блокируются длинным кодом контроллера?

$scope.medications = API.Client.MedicationProfiles.query({ clientId: clientId }); 

Служба API имеет это определение ресурса Client.MedicationProfiles:

this.Client.MedicationProfiles = $resource(
    '/Noteable.API/api/Client/:clientId/MedicationProfiles/:id', 
    { 
     clientId: '@clientId', 
     id: '@Id' 
    }, 
    { 
     update: { method: 'PUT' } 
    } 
); 

я могу увидеть все из запросов, поступающих на сервер, в основном, используя инструменты chrome dev при загрузке страницы, но оказалось, что они возвращались по одному, как если бы они выполнялись синхронно. Я поместил thread.sleep в один из действий контроллера Web.API и, конечно же, все вызовы, выпущенные после этого, не смогли вернуться до тех пор, пока спящий не сделает. Это не имеет никакого смысла для меня, и мне интересно, может ли кто-нибудь сказать мне, в каком случае они ожидали бы этого.

+1

Можете ли вы поделиться своим веб-код контроллера апи? – scniro

ответ

2

Это может быть хорошей ситуацией для реализации асинхронного шаблона на вашем веб-сервере api - вы будете избавлены от блокировки вызовов ajax, как только они попадут в ваш контроллер. Это может быть достигнуто за счет использования шаблона async и await. Вы захотите вернуть Task, который представляет собой асинхронную операцию.

Примером может включать в себя ...

public async Task<IHttpActionResult> Put(string clientId) 
{ 
    var response = await this.yourService.yourSavingMethod(clientId); 

    return Ok(response); 
} 

Также см SO вопрос Why is this web api controller not concurrent? для получения более подробной информации и понимания по этому вопросу. Кроме того, поведение по умолчанию для состояния сеанса ASP.NET и может быть изменено для удовлетворения одновременных запросов. Примером может включать в себя

HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly) 

ASP.NET Session State Overview

+0

В частности, мы включили сеанс в web.api. Одновременные вызовы с одного сеанса были заблокированы из-за необходимости доступа к сеансу. – sonicblis

+0

Кстати, реализация асинхронного шаблона не разрешает это. – sonicblis

+0

Просто узнав о специфике сессии для вашего бэкэнда, я добавлю к ответу. Если бы вы не догадывались о своей реализации api без всех деталей, о которых идет речь @sonicblis – scniro