【问题标题】:C# Web API - BlockingC# Web API - 阻塞
【发布时间】:2014-12-17 18:15:03
【问题描述】:

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

对外部 API 的一次调用可能需要 10-15 秒(一点也不稀奇)...

在加载页面时,每个块都会触发一个使用 jQuery(我们使用主干)的 Ajax 调用,该调用向我们自己的 API(它就像一个代理,只将调用转发到外部 API)请求数据。

从一开始我们就认为“啊,很好,ajax 将解决我们所有的问题”......在客户端确实如此......但是,我们没有在服务器端使用异步或类似的东西,所以我猜你能看出我们面临什么问题……没错,就是阻塞线程。

因此,我们的并发用户不能超过 2-3 个。 我们将 c# MVC 与 Web Api 一起使用,在前端我们使用 Backbone。

我的问题是;异步控制器会解决我们的问题吗?或者我们应该以另一种方式实现它?你们中的一些人会说“只要缓存数据就可以了”。是的,我们正在缓存数据,但它仍然会阻塞所有线程(不像第一个请求那样长,但仍然很明显)

我看到了很多不同的解决方案:

那么,你们有什么推荐的呢?

另外,我发现了这个:Why is my async ASP.NET Web API controller blocking the main thread? 答案表明这是浏览器本身的问题,在从第一个请求获得响应之前它不允许多个并发调用?

【问题讨论】:

    标签: c# multithreading backbone.js asynchronous asp.net-web-api


    【解决方案1】:

    解决方案非常简单。在我的基本控制器上,我放置了这个属性: SessionState(SessionStateBehavior.Disabled)

    ASP.NET 会锁定所有请求,这意味着如果您执行并发请求,它们将不会并行运行。

    您可以在this article from Microsoft 中阅读更多相关信息。

    对 ASP.NET 会话状态的访问是每个会话独占的,这意味着 如果两个不同的用户同时发出请求,访问每个 同时授予单独的会话。但是,如果两个并发 请求是针对同一个会话(通过使用相同的 SessionID 值),第一个请求获得对会话的独占访问权 信息。第二个请求仅在第一个请求之后执行 完成了。 (如果独占,第二个会话也可以访问 对信息的锁定被释放,因为第一个请求超过了 锁定超时。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2019-07-31
      • 2011-03-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多