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

C# 为什么单用户对同一ApiController的多个调用是同步处理的?,c#,asp.net-web-api,C#,Asp.net Web Api,我做了一个简单的GET,循环10次,每次迭代等待1秒来模拟工作。当我从Chrome中的一个选项卡调用此路由时,需要10秒(如预期的那样)。当我同时呼叫此路线时(从两个不同的选项卡),第一个选项卡需要10秒才能完成,而第二个选项卡需要20秒 如果我将第二个选项卡设为“匿名”选项卡,则当同时运行时,两个请求将在10秒内返回。我还注意到,如果我有两个不同的控制器(和两个不同的路由),那么来自两个非匿名选项卡的同时请求会同时返回 有人能解释为什么对同一控制器的多个请求是同步处理的吗 编辑:该站点目前在I

我做了一个简单的GET,循环10次,每次迭代等待1秒来模拟工作。当我从Chrome中的一个选项卡调用此路由时,需要10秒(如预期的那样)。当我同时呼叫此路线时(从两个不同的选项卡),第一个选项卡需要10秒才能完成,而第二个选项卡需要20秒

如果我将第二个选项卡设为“匿名”选项卡,则当同时运行时,两个请求将在10秒内返回。我还注意到,如果我有两个不同的控制器(和两个不同的路由),那么来自两个非匿名选项卡的同时请求会同时返回

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


编辑:该站点目前在IIS中是自托管的。ASP.NET使用会话状态锁定来确保在给定时间同一会话上只处理一个请求。这有助于防止会话状态周围出现争用情况

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

有关详细信息,请参阅或

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

您的站点托管在什么上?afaik控制器已弃置,只能一次性使用。@DavidNeale该站点在IISTry中自托管,来自不同的客户端,你们会得到10秒的回应。@Maess我想问题在于我的设计……我在同一个控制器中有多个get,我是从AJAZ请求中点击的。我可能应该将这些调用移动到它们自己的控制器。因此,我假设如果我的所有控制器都继承自一个基本控制器(我已经将特定于控制器的缓存抽象为一个基本控制器),那么会话状态锁就是为什么每次处理一个对这些控制器的调用的原因?有没有办法关闭会话状态锁定?谢谢你的更新…不过有一件事。链接文章说,处理独占锁定的一种方法是“使用类似REST的服务,如ASP.NET WebAPI或WCF REST。因为REST本质上是无状态的,所以禁止使用会话状态。”我正在使用WebAPI(这些是APIController),但我仍然受到影响。我还应该用SessionStateAttribute显式地标记控制器吗?@Ryan:这是一个很好的观点。我认为apicontroller没有访问会话的权限。然而,大多数浏览器自愿限制同一域的并发请求数(通常为2或3)。你能用浏览器的开发工具看看这是否能解释你获得的并发性水平吗?我同时测试了2个来自Chrome的连接,限制为1个。我在IE中做了同样的测试,并且能够同时得到结果。因此,在使用同一会话时,浏览器似乎一直在限制对同一路由的调用。@Ryan:这很有趣。我想知道Chrome是否希望在发送另一个请求之前查看结果是否可以缓存。如果将缓存破坏查询参数添加到请求中,会发生什么情况?