为什么单个用户对同一个ApiController的多次调用是同步处理的?

时间:2013-12-03 16:14:18

标签: c# asp.net-web-api

我做了一个简单的GET循环10次,每次迭代等待1秒来模拟工作。当我从Chrome中的一个标签调用此路线时,需要10秒钟(按预期方式)。当我同时调用此路径时(从2个不同的选项卡),第一个选项卡需要10秒才能完成,但第二个选项卡需要20秒。

如果我将第二个标签设为隐身标签,则两个请求在同时运行时会在10秒后返回。我还注意到,如果我有2个不同的控制器(以及2个不同的路由),则来自2个非隐身标签的同时请求会同时返回。

有人可以解释为什么同步处理对同一控制器的多个请求吗?

编辑:该网站目前在IIS中自托管

1 个答案:

答案 0 :(得分:6)

ASP.NET使用会话状态锁定来确保在给定时间内只在同一会话上处理一个请求。这有助于防止会话状态周围的竞争条件。

通过使用SessionStateAttribute告诉ASP.NET您不打算写入会话状态,可以获得更好的并发性。

有关详细信息,请参阅this articlethis article

更新

由于您使用的是ApiController,因此上述行为可能不适用。但是,浏览器将进一步限制并发性,如this post的答案中所述。