为什么我的web.api请求被长时间运行的控制器代码阻止?

时间:2015-05-05 15:44:09

标签: javascript c# angularjs asp.net-web-api angular-resource

我在本地开发环境中使用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,当然,在该操作之后发出的所有调用都无法返回,直到睡眠状态为止。这对我没有任何意义,我想知道是否有人可以告诉我他们会在什么情况下预期这一点。

2 个答案:

答案 0 :(得分:2)

在您的web api后端实现异步模式可能是一个很好的情况 - 一旦他们点击你的控制器,你就可以减轻你的ajax调用阻塞。这可以通过利用asyncawait模式来实现。您需要返回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)

ASP.NET Session State Overview

答案 1 :(得分:0)

我认为您的问题是由浏览器或ASP.NET引起的。如果它是ASP.NET,请看一下这个帖子:

C# Web API - Blocking

如果是您的浏览器,请使用示例代码查看此主题:

Why is my async ASP.NET Web API controller blocking the main thread?