我们已经构建了一个从外部API加载数据的web服务。一个标准页面包含6-8个模块,所有这些模块都从API中从不同的资源加载数据。它看起来像这样(每个块从一个不同的url装载,例如/cars,/phones,/games.

一个对外部API的调用可能需要10-15秒(一点也不稀奇).
当加载页面时,每个块将使用jQuery(我们使用主干)触发Ajax调用,请求我们自己的API(就像一个代理,只将调用路由到外部API)以获取数据。
从一开始我们就认为“啊很好,ajax将解决我们所有的问题”--...and--它确实是这样做的,在客户机side...However上,我们没有在服务器端使用异步或类似的东西,所以我想您可以看到我们所面临的问题……这是对的,阻塞线程。
因此,我们不能有超过2-3个并发用户.我们使用的是c# MVC和Web,在前端我们使用的是主干。
我的问题是:异步控制器会解决我们的问题吗?还是我们应该用另一种方式来实现这一点?有些人会说“只要缓存数据,你就会没事”。是的,我们正在缓存数据,但它仍然会阻塞所有线程(不像第一个请求那么长,但仍然值得注意)。
我看到了很多不同的解决方案:
那么,你们有什么建议?
此外,我还发现:为什么我的异步ASP.NET Web控制器阻塞主线程?,其中的答案表明浏览器本身存在问题,在从第一个请求获得响应之前不允许多个并发调用?
发布于 2015-01-29 19:41:43
解决办法真的很简单。在我的基本管理器上,我添加了以下属性: SessionState(SessionStateBehavior.Disabled)
ASP.NET对所有请求设置一个锁,这意味着如果您执行并发请求,它们将不会并行运行。
您可以在这篇文章来自微软中阅读更多有关它的信息。
对ASP.NET会话状态的访问是每个会话的独占性,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问。但是,如果对同一个会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问。第二请求仅在第一请求完成后执行。(如果释放了信息上的独占锁,则第二个会话也可以访问,因为第一个请求超过了锁定超时。)
https://stackoverflow.com/questions/27532142
复制相似问题