长时间运行ajax与轮询

长时间运行ajax与轮询,ajax,signalr,long-polling,Ajax,Signalr,Long Polling,我正在尝试决定我的web应用程序的最佳解决方案。我有一个页面,它将触发任意数量的ajax请求,以从服务器检索数据。例如,加载的页面可能向服务器发出10个ajax请求,每个请求可能需要10秒(+-)才能返回内容 考虑到这是一个多用户和多并发环境中的web应用程序,使用传统的ajax方法是一个好主意,还是选择长轮询,例如SignalR 两种方法(拉式与推式)的优缺点是什么?最终,我追求的是最节省资源的方法 谢谢在您所述的示例中,您所说的是一个纯粹的“拉动”场景。即“当页面加载时,我希望X、Y、Z发生

我正在尝试决定我的web应用程序的最佳解决方案。我有一个页面,它将触发任意数量的ajax请求,以从服务器检索数据。例如,加载的页面可能向服务器发出10个ajax请求,每个请求可能需要10秒(+-)才能返回内容

考虑到这是一个多用户和多并发环境中的web应用程序,使用传统的ajax方法是一个好主意,还是选择长轮询,例如SignalR

两种方法(拉式与推式)的优缺点是什么?最终,我追求的是最节省资源的方法


谢谢

在您所述的示例中,您所说的是一个纯粹的“拉动”场景。即“当页面加载时,我希望X、Y、Z发生,然后我希望看到结果”

长轮询/websockets(SignalR)对于推送场景很有用-例如“哦,看,我已经完成了这个超长进程的运行…”。。。我最好告诉所有当前已连接的用户”


您可以使用signar来运行那些普通样式的AJAX请求。。。但您不会得到任何性能增强。AJAX将异步并行运行,一旦服务器端进程完成,您将执行一个回调。由于signalR将有一个连续的连接在运行,所以您可能会得到性能上的轻微提高,因此您将在创建连接时失去轻微的延迟。另一方面,服务器将运行大量打开的连接,这可能会降低性能(特别是如果您用10 X 10秒的计算来实现这一点)

在您所述的示例中,您所说的是纯“拉”场景。即“当页面加载时,我希望X、Y、Z发生,然后我希望看到结果”

长轮询/websockets(SignalR)对于推送场景很有用-例如“哦,看,我已经完成了这个超长进程的运行…”。。。我最好告诉所有当前已连接的用户”


您可以使用signar来运行那些普通样式的AJAX请求。。。但您不会得到任何性能增强。AJAX将异步并行运行,一旦服务器端进程完成,您将执行一个回调。由于signalR将有一个连续的连接在运行,所以您可能会得到性能上的轻微提高,因此您将在创建连接时失去轻微的延迟。另一方面,服务器将运行大量打开的连接,这可能会降低性能(特别是如果您使用10 X 10秒的计算来运行连接)

您的意思是打开10x10 ajax请求会降低服务器性能吗?所以对于这个特定的场景,信号器将是更好的选择?这是您在页面上显示的信息,对吗?对于每个加载的页面,您需要调用10个计算代价高昂的调用来显示数据?在这种情况下,信号员不会真的帮上忙。。。不管怎样,这10个调用都会同时命中服务器——即问题似乎不是传输机制,而是调用的长时间运行。我明白了。我担心Ajax请求会阻塞服务器上的线程。至少使用SignalR,我可以异步运行请求并将结果推送到页面。想法?这可能是正确的。虽然如果每一个页面点击总共需要100秒,我认为在线程数量成为问题之前,服务器资源将很长时间耗尽。如果发现问题确实存在,则可以使用AsyncController而不是Controller,并返回任务而不是ActionResult(建议使用(.NET 4.5),或者使用ApicController(Web Api),也可以返回任务。在我看来,这将解决线程限制问题,并且更容易实现。你是说打开10x10个ajax请求会降低服务器性能吗?所以对于这个特定的场景,信号器将是更好的选择?这是您在页面上显示的信息,对吗?对于每个加载的页面,您需要调用10个计算代价高昂的调用来显示数据?在这种情况下,信号员不会真的帮上忙。。。不管怎样,这10个调用都会同时命中服务器——即问题似乎不是传输机制,而是调用的长时间运行。我明白了。我担心Ajax请求会阻塞服务器上的线程。至少使用SignalR,我可以异步运行请求并将结果推送到页面。想法?这可能是正确的。虽然如果每一个页面点击总共需要100秒,我认为在线程数量成为问题之前,服务器资源将很长时间耗尽。如果发现问题确实存在,则可以使用AsyncController而不是Controller,并返回任务而不是ActionResult(建议使用(.NET 4.5),或者使用ApicController(Web Api),也可以返回任务。这将处理线程限制,并且在我看来更容易实现。