使用ajax和webapi进行长时间轮询时的瘦身是什么……它会杀死我的
我有一个非常简单的长轮询ajax调用,如下所示:
(function poll(){ $.ajax({ url: "myserver",success: function(data){ //do my stuff here },dataType: "json",complete: poll,timeout: 30000 }); })(); 我刚刚今天下午选了这个例子,看起来效果很好.我正在使用它在我的页面上构建一些html,它几乎是瞬间我尽力而为.我有点担心,这会让我的服务器上的工作线程保持打开状态,如果我在服务器上有太大的负载,它就会完全停止.有人能否对这一理论有所了解?在后端我有一个webapi服务(.net mvc 4),它调用数据库,构建对象,然后将对象传回.在我看来,为了使这个工作,服务器将不得不不断地调用数据库…这可能是不对的??? 我的下一个问题是客户端确定是否需要更新页面上的html的最佳方法是什么?目前我正在使用JSON.stringify()将我的对象转换为字符串并比较字符串和旧字符串,如果有一个delta,它会在页面上重写html.现在不是一个整体在对象下降很多,但它可能会变得非常大,我认为进行字符串比较可能在客户端上非常耗费资源……特别是如果它几乎不断地进行. 对我来说,底线是这样的:我不确定轮询的工作时间有多长.我只是用Google搜索并找到了上面的示例代码并实现了它,从表面上看,它很棒.我只是担心它会让事情变得糟糕down(在服务器上)和我将旧结果与new进行比较的方式会降低(在客户端上). 我们非常感谢您提供的任何和所有信息. TIA.
我同意SLaks – 即如果你需要使用WebApi
http://www.asp.net/signalr的实时网络,则使用SignalR.长轮询难以很好地实现,让其他人处理这种复杂性,即使用SignalR(WebApi的自然选择)或Comet.
在使用长轮询,Web套接字,服务器发送事件和永久帧(here)之前,SignalR尝试其他3种形式的通信. 在某些情况下,您可能更适合使用简单的轮询,即每秒钟左右更新一次……请查看this文章.但这是一个引用:
担心的是,如果网页上有任何重大负载,您的30秒ajax查询最终可能会成为您自己的拒绝服务攻击. 如果负载过多,即使Bayeux(CometD)也会采用简单的轮询:
至于你问的第二部分. 如果您使用长轮询,那么理想情况下您的服务器应该只返回更新,如果实际上已经发生了某些变化,那么您的UI应该“信任”响应并假设响应意味着新数据.任何服务器推送类型方法都是如此. 如果您确实向下移向简单的轮询pullmethod,那么您可以使用内置的http方法来检测更新,使用If-Modified-Since标头,这将允许您返回304 Not Modified,因此服务器将检查时间戳object,如果自上次请求后已经修改了对象,则仅返回200. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |