为什么我对 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)
我正在我的本地开发环境中使用 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)