2011-03-02 134 views
13

我需要一个“实时”元素添加到我的Web应用程序。基本上,我需要检测存储在SQL Server表中的“更改”,并在发生更改时更新UI的各个部分。实时ASP.NET MVC Web应用程序

我目前通过轮询这样做。我每3秒向服务器发送一个ajax请求,要求做出任何新的更改 - 然后这些更改将被返回并处理。它可以工作,但我不喜欢它 - 这意味着对于每个浏览器我都会频繁发出这些请求,并且服务器将一直忙于处理它们。总之,它不能很好地扩展。

是否有避免轮询开销任何聪明的选择吗?

编辑

在完整性的利益,我更新这个何况我们最终与去解决 - SignalR。它的操作系统来自微软。它越来越受欢迎,我可以衷心推荐它,或者我们也看过的WebSync。

+0

http://stackoverflow.com/questions/4555462/reverse-ajax-with-iis-asp-net – 2011-03-02 13:18:04

回答

10

退房WebSync,彗星服务器专为ASP.NET/IIS。

特别是,我会做的是使用SQL Dependency类,并且当您检测到更改时,请使用RequestHandler.Publish("/channel", data);将信息发送给适当的侦听客户端。

应该工作得很好。

+2

应该工作得很好 - 说作者;-) – 2011-03-02 14:14:46

+1

公平,这是相当惊人的(WebSync) 。演示(尤其是地图之一 - 你需要打开2个浏览器窗口)非常简单,但很有教育意义 – 2011-03-02 14:34:50

+1

WebSync看起来非常酷,虽然理想情况下我想要一个免费的解决方案(或者说,客户端会喜欢免费的解!)。 – 2011-03-02 15:05:01

1

看看this article

我在什么地方读(不记得在哪里),使用此功能WCF使未消耗阻塞线程的方式宿主进程处理请求。

5

直接由的Jakub refernced链接(即)采取:

Reverse AJAX with IIS/ASP.NET

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

其实我已经用这个和社区版是相当特殊的。非常值得一看,因为这种类型的技术将在未来几个月/几年开始主导景观。 codeplex站点随附asp.net mvc示例。

+0

您的链接已损坏... – 2011-03-02 13:46:30

+0

jakub -how奇怪,我实际上在不到10分钟前访问过那个链接 - 谢谢你的提升。已改为直接codeplex项目链接 – 2011-03-02 13:50:06

+0

似乎从加拿大工作... – MikeJ 2011-03-02 14:05:18

5

无论如何:你总是被限制在HTTP(大部分)是单向街道的事实上。除非你在客户端上实现了一些合理的代码(比如监听传入的网络请求),否则其他任何事情都会涉及到轮询服务器的更新,不管别人会告诉你什么。

我们有类似的要求:在我们的一个实时Web应用程序中有非常快的响应时间,为每个Web服务器提供约400-500个客户端。服务器需要几乎在0.1秒内通知客户端(电话号码为& VoIP)。我们实施了Async Handler。在每个轮询请求中,我们将请求休眠5秒钟,等待信号脉冲信号响应客户端。如果5秒钟结束,我们以“无事件”响应,客户端将立即再次发送请求。这导致了非常快速的响应时间,并且我们从来没有遇到任何问题,每台机器最多可以有500个客户端。不知道在轮询请求可能会产生问题之前我们可以添加多少。

+0

这几乎是我所做的。您最终会得到一个队列,您可以根据需要轮询并下拉事件。事实上,我确信堆栈溢出是如何工作的以及页面顶部的“toast”是如何工作的。 – MikeJ 2011-03-02 14:04:26

+0

这听起来像是一个非常好的常识方法来不确定的ping ..喜欢它+1 – 2011-03-02 14:36:36

1

根据您对应用程序的限制,您可以使用Silverlight执行此连接。您不需要为Silverlight提供任何UI,但是您可以使用套接字具有接受服务器端数据推送的连接。