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

Why are my requests to web.api being blocked by long running controller code?

我正在我的本地开发环境中使用 angular 向 Web.API 发出 ajax 调用(IIS 8.5 托管)。我正在通过不同的 angular 控制器同时拨打 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 开发工具看到所有请求基本上同时发送到服务器,但看起来它们一次返回一个,就好像它们已经 运行同步。我在 Web.API 控制器操作之一中放置了一个 thread.sleep 并且果然,在该控制器操作之后发出的所有调用都无法 return 直到睡眠操作发生。这对我来说没有任何意义,我想知道是否有人可以告诉我在什么情况下他们会期望这个。

我认为您的问题是由浏览器或 ASP.NET 引起的。如果是 ASP.NET,请查看此线程:

C# Web API - Blocking

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

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

这可能是在您的网络 api 后端实现异步模式的好情况 - 一旦它们到达您的控制器,您就会从 ajax 调用阻塞中解脱出来。这可以通过利用代表异步操作的 async and await pattern. You'll want to return a 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