实时ASP.NET MVC Web应用程序

13

我需要为我的网站添加"实时"元素。基本上,我需要检测存储在SQL Server表中的"更改",并在发生更改时更新UI的各个部分。

目前我是通过轮询来实现这一点的。每3秒钟我向服务器发送一个ajax请求,以查找任何新的更改-然后将它们返回并进行处理。虽然它能正常工作,但我并不喜欢它-因为对于每个浏览器,我都会频繁地发出这些请求,服务器总是忙于处理这些请求。简而言之,这种方法的扩展性不太好。

有没有什么巧妙的替代方案可以避免轮询造成的开销呢?

编辑

为了完整起见,我更新一下我们最终采用的解决方案-SignalR。它是来自Microsoft的开源程序库。它越来越受欢迎,我可以大力推荐这个方案,或者我们也看了一下WebSync。


http://stackoverflow.com/questions/4555462/reverse-ajax-with-iis-asp-net - Jakub Konecki
5个回答

10

1
虽然公平地说,WebSync相当惊人。演示(特别是地图演示-您需要打开2个浏览器窗口)非常简单但有教育意义。 - jim tollan
1
WebSync 看起来确实很酷,但理想情况下我希望有一个免费的解决方案(或者更确切地说,客户希望有一个免费的解决方案!)。 - Matt Roberts
呵呵,没错Jakub;)。对于任何想知道他在说什么的人——我是WebSync的开发人员之一,受Frozen Mountain雇用:)。这里没有隐藏任何东西。 - Jerod Venema
1
@Matt - 他们不总是这样吗? :) 问题是,“免费”是指你实现的时间,还是购买现有解决方案...似乎我每天都要进行这样的对话。但是,这可能是一个不同的地方的问题 :-D - Jerod Venema
3
再次仔细观察后,我感到非常印象深刻,并在等待老板的回应,看看是否有购买的可能性 :) - Matt Roberts

5

直接从Jakub提供的链接中获取(即):

使用IIS/ASP.NET进行反向AJAX

PokeIn on codeplex为您提供增强的JSON功能,以使您的服务器端对象在客户端可用。简单地说,它是一个反向Ajax库,可以轻松调用C#/VB.NET中的JavaScript函数,并调用JavaScript中的C#/VB.NET函数。它具有众多功能,如事件排序、资源管理、异常处理、编组、Ajax上传控件、单兼容性、WCF和.NET Remoting集成以及可扩展的服务器推送。该库有一个免费的社区许可选项,并且与其他库相比,许可选项非常具有成本效益。

我实际上已经使用过这个库,社区版非常特别。值得一看,因为这种技术将在未来几个月/年开始占据主导地位。codeplex网站配有asp.net mvc样例。


Jakub - 多么奇怪啊,我不到10分钟前刚访问了那个链接 - 感谢你提醒。我已经更改为直接的CodePlex项目链接。 - jim tollan

5
无论如何: 你总是会受到HTTP(大多数情况下)是单向的这个事实所限制。除非在客户端实现一些明智的代码(即监听传入的网络请求),否则任何其他方法都将涉及轮询服务器以获取更新,不管别人告诉你什么。

我们有一个类似的需求:在我们的实时Web应用程序中为每个Web服务器提供大约400-500个客户端非常快的响应时间。服务器需要在几乎0.1秒(电话和VoIP)内通知客户端。

最后,我们实现了一个异步处理程序。在每个轮询请求上,我们将请求暂停5秒钟,等待信号量脉冲信号以响应客户端。如果5秒钟结束,我们会回复“没有事件”,客户端将立即再次发送请求。这导致非常快的响应时间,并且我们从未遇到过每台机器多达500个客户端的问题...不知道在轮询请求可能创建问题之前我们可以添加多少个客户端。


这基本上就是我所做的。你最终会得到一个队列,你可以轮询并根据需要拉取事件。实际上,我非常确定这就是Stack Overflow的工作方式,以及它顶部的“toast”是如何工作的。 - MikeJ
这听起来像是一种非常好的常识方法来处理不确定的ping,我喜欢它+1。 - jim tollan

1

看一下本文

我在某处读到过(不记得在哪里了)使用这个WCF特性可以使主机进程以不消耗阻塞线程的方式处理请求。


1

根据您的应用程序限制,您可以使用Silverlight进行此连接。您不需要为Silverlight拥有任何UI,但是您可以使用Sockets建立一个接受数据服务器端推送的连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接