我在本地开发环境中使用angular来发出对Web.API(IIS 8.5托管)的ajax调用。我同时通过不同的角度控制器进行5次呼叫,每个呼叫都是这样的:
$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工具基本上立即看到所有发送到服务器的请求,但看起来他们一次又一次回来,好像他们已经同步运行一样。我在其中一个Web.API控制器操作中放了一个thread.sleep,当然,在该操作之后发出的所有调用都无法返回,直到睡眠状态为止。这对我没有任何意义,我想知道是否有人可以告诉我他们会在什么情况下预期这一点。
答案 0 :(得分:2)
在您的web api后端实现异步模式可能是一个很好的情况 - 一旦他们点击你的控制器,你就可以减轻你的ajax调用阻塞。这可以通过利用async
和await
模式来实现。您需要返回Task
,表示异步操作。
一个例子可能包括......
public async Task<IHttpActionResult> Put(string clientId)
{
var response = await this.yourService.yourSavingMethod(clientId);
return Ok(response);
}
另请参阅问题Why is this web api controller not concurrent?以获取有关此问题的更多详细信息和见解。此外,ASP.NET会话状态的默认行为可以更改为适应并发请求。一个例子可能包括
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly)
答案 1 :(得分:0)
我认为您的问题是由浏览器或ASP.NET引起的。如果它是ASP.NET,请看一下这个帖子:
如果是您的浏览器,请使用示例代码查看此主题:
Why is my async ASP.NET Web API controller blocking the main thread?