ASP.. NET MVC异步控制器vs服务器推送(COMET/反向Ajax)



我正在构建一个ASP。. NET MVC站点,其中客户端(浏览器)可以调用需要30分钟(或更长时间)来处理的API。显然,我不能使用正常的MVC控制器来做到这一点,因为一些这样的请求会阻塞我所有的IIS工作线程,从而阻塞其他更快的调用。

我看了下面两个选项:

  1. ASP。. NET MVC的异步控制器
  2. PokeIn库,允许服务器推送通过反向AJAX(长时间保持HTTP请求的旧浏览器)或WebSockets(从HTML5规范的新浏览器)

现在这两个似乎都是一个很好的可行的选择。

选项1对我来说似乎最容易实现。使用异步控制器,我的IIS工作线程不会被阻塞,因此允许我的其他更快的API调用无缝地通过。然而,从异步控制器文档中,我认为,它会产生另一个非IIS线程,这将被阻塞/等待我长时间运行(30~分钟)的进程来完成。我曾读到,"如果你在控制器中阻塞或休眠,无论它是否异步,这都是非常糟糕的。"

在选项2中,如果我的客户端使用支持WebSockets的新浏览器,这可能是最高效的,因为我不需要在服务器端有任何阻塞线程。当客户端触发一个缓慢的API调用时,我会引发一个事件,在该事件完成后(比如30分钟后),我会引发另一个事件,用更新的内容更新所有客户端的浏览器。然而,PokeIn库,如果我的部分客户端没有WebSocket支持的浏览器(旧的…),我不确定他们是否会占用我的IIS工作线程之一。

选项2对于我的需求来说是不是太过分了?在选项1是不好让我的异步控制器等待缓慢的过程?选项1的另一个缺点是,如果用户在请求完成之前刷新页面,那么一旦完成,他将不再获得作业的更新!

欢迎大家提出意见和建议。

谢谢

PokeIn使用相同的内存/线程池来为websocket和ajax连接推送消息,因为它有内部的websocket服务器。ajax和websocket的交付时间肯定是不同的,但无论你选择哪种方法/选项,都会有差异。此外,可能你已经知道,但Pokein退回到comet ajax,以防客户端不支持websocket,你不需要处理它。

希望这回答了你对选项2的问题。

最新更新