我有一个非常简单的长轮询AJAX调用是这样的:
(function poll(){
$.ajax({ url: "myserver", success: function(data){
//do my stuff here
}, dataType: "json", complete: poll, timeout: 30000 });
})();
我拿起这个例子了,今天下午,它似乎工作的伟大。 我用它来建立我的页面上一些HTML和它的最佳,我可以告诉几乎是瞬时的。 我有点担心,虽然,这是要保持工作线程我的服务器上开放的,如果我有太大的服务器上的负载,它会完全停止。 有人可以提供一些线索这一理论? 在后端我有(.NET MVC 4)调用数据库,建立对象的WebAPI服务,然后把对象回落。 它还在我看来,为了使这项工作,服务器必须是调用数据库不断......这不可能是不错吧???
我的下一个问题是什么是客户的最佳途径,以确定是否需要更新我的页面上的HTML? 目前,我“米透过JSON.stringify()把我的对象转换为字符串,并比较这归结为旧字符串,如果有一个三角形,它在页面上重新写HTML的字符串。现在有没有一个整体很多对象下来,但它可能会变得非常大,我认为这样做字符串比较可能是相当的资源在客户端上密集的......特别是如果它做它几乎不断。
我的底线是这样的:我“不能确定确切知道投票站有多长的工作我只是用Google搜索了一下,发现上面的示例代码,并实现了它,并在表面上,它的真棒我只是担心它会停滞不前的事情。下来,我比较旧的结果,以新的方式(在服务器上)将会陷入thigns下来(在客户端)。
您可以提供的任何及所有信息是极大的赞赏。
TIA。
我agreee与SLaks -即使用SignalR,如果你需要的WebAPI实时网络http://www.asp.net/signalr 。 长轮询是很难落实好,让别人去处理这种复杂性,即使用SignalR(为的WebAPI自然选择)或彗星。
SignalR尝试其他3种形式的通信诉诸长轮询,网络插座,服务器发送的事件和永远帧(前这里 )。
在某些情况下,你可能是用简单的投票更即命中每一秒左右更新......看看这个文章。 但这里是一个报价:
当你有一个高的消息量,长轮询并不比传统的轮询任何实质性的性能提高。 事实上,它可能会更糟,因为长轮询可能会失控到即时民调未节流的,连续的循环。
令人担心的是与你的网页上的任何显著负荷您30秒AJAX查询可能最终会被自己的拒绝服务攻击。
即使贝叶 ( 的cometd )将诉诸简单的投票,如果负载得到太多:
增加服务器负载和资源耗尽通过使用重新连接和间隔的意见领域节流的客户,解决其在最坏的情况下退化到传统的轮询行为。
至于你问题的第二部分。
如果你正在使用长轮询那么你的服务器应该理想地仅是返回一个更新,如果事情确实发生了变化。因此您的UI或许应该“信任”的响应,并假设响应意味着新的数据。 这同样适用于任何的服务器推送型的方法。
如果你没有走向简单的投票pullmethod背下来,那么你可以使用使用检测更新内置的HTTP方法了If-Modified-Since头,这将允许你返回一个304未修改,那么服务器会检查的时间戳对象,如果它已经自上次请求只修改一个对象返回一个200。
OK,我的两分钱:
- 正如有人说,SignalR是经得起考验的代码,所以我真的会考虑使用,而不是写我自己。
- SignalR确实改变了一些IIS设置,优化IIS这样的工作的。 所以,如果你正在寻找实现自己,看看在SignalR完成IIS设置更改
- 我想你是做长轮询使您的服务器可以实现某种形式的服务器推送的。 只要记住,这将打开你的HTTP无状态机进入一个状态机 ,如果你想扩展这是不好的。 在负载ballancer长轮询是不是很好 :) 对我来说,这是关于服务器推送最糟糕的事情。
- ASP.NET使用线程池的服务请求。 长轮询将霸占一个线程池线程。 如果你有太多的这些线程可能会在线程饥饿(和眼泪)结束。 作为一个大概的数字,100也不算很多,但+1000是。
- 即使SignalR团队说,这是SingalR优化IIS中,可能不是正常的ASP.NET优化,他们建议分开这些箱子。 因此,这意味着成本和开销。
在一天结束的时候,我建议使用长轮询,如果你正在解决业务问题 (而不是因为它只是酷),因为那时,将支付其费用和管理费用和头痛。
文章来源: what's the skinny on long polling with ajax and webapi…is it going to kill my server? and string comparisons