2012-09-05 38 views
1

我有一个有趣的问题,我需要解决,我不知道哪里可以开始。我正在编写一个MVC Web应用程序,通过表单获取记录列表,并为每个应用程序创建一个ajax调用。 ajax调用的控制器使用的资源一次只能处理一个请求。简单的解决方案是将ajax调用更改为同步,但是,这会挂起浏览器并导致糟糕的体验。队列请求MVC控制器

此外,多个用户可能会同时使用此应用程序,因此客户端的排队不起作用。

任何人有任何建议吗?

迈克

+1

您是否考虑将控制器更改为异步? –

+0

我没有。这是我的理解,一个异步控制器不会帮助我。这不是这种情况吗? – mcottingham

+0

我想这取决于这里定义的资源:'使用一次只能处理一个请求的资源'。你能否更多地了解为什么一次只能处理一个,或者它是什么类型的资源? –

回答

0

好第一关,我的要求是不太一样的你。我的问题是我的后端数据库往往有点慢,用户的响应速度非常重要。

因此,我不得不从等式中删除数据库交互。

我的解决方案有两个主要部分:

  1. 保持数据的服务器端缓存

  2. 创建一个单独的进程中包含的所有数据库的工作,可以与服务器

互动

单独的进程是作为由Windows服务托管的命名管道WCF服务实现的。

的基本过程的概述是:

  1. 用户点击“保存”,阿贾克斯张贴形式向一个MVC控制器
  2. 控制器更新缓存中的数据,然后调用WCF管
  3. 服务将数据推入并发队列(以及会话ID),并返回一个guid令牌
  4. 控制器将令牌作为JSON响应返回。
  5. jQuery Ajax处理程序拦截响应并将该令牌保存到一个UI元素中,该UI元素表示“已保存”表单。

服务本身是这样的:

  1. 在开始创建一个定时器。
  2. 定时器打勾:
  3. 停止定时器。
  4. 从并发队列
  5. 删除所有排队的工作项目发送的每个项目由工作处理器
  6. 要处理的项目添加到“已完成”,或“有错误”并发字典,由早期的键控会话ID(以及一些时间保持东西以消除陈旧的数据)。这包括原始工作令牌。
  7. 再次启动计时器。

回到用户的土地,有一个JavaScript的setInterval环运行:

  1. Ajax请求到服务器(心跳控制器)
  2. 控制器连接到服务,并将当前的会话ID
  3. 该服务从“完成”和“错误”的字典
  4. 控制器返回列表作为JSON对象阵列返回的所有项目
  5. 通返回列表的javascript循环和使用代币做适当的UI更新

最终的结果是,尽管缓慢的后端服务器持续一个非常敏感的用户界面。

如果您希望实现代码的任何特定部分让我知道。

+0

谢谢!这绝对有帮助。我想我听到的是,这不会是我应该在我的Web应用程序中做的事情。我需要有一个外部服务来排队和执行。 – mcottingham