2012-03-16 51 views
0

我一直在环顾四周,我需要做出各种各样的定时器解决方案。在ajax环境。听起来不错,但我不想每隔1-5秒发一个新的请求,以确保页面上有最新的更新数据。 所以我听说过有关signalR的一些信息,但这听起来过于复杂,我想大多数情况下这对我来说都是未知的。 我也读过一些关于silverlight能够帮助这种努力的东西。如何使用剃须刀引擎更新mvc 3中数据库更改的页面/(页面上的对象)?

案例很简单我有一张填充了数据库值的图表,现在这个数据库每天都在变化,有些时候它不会保留任何新的数据几个小时。我希望能够显示当前的实时数据。我使用的是Razor引擎,mssql数据库和IIS Express 7.5的MVC 3。

我在这个环境之外的选择非常有限。

它只会在本公司内部使用。将有10-50个地方访问该页面。我担心的不是超负荷的公司服务器和网络。

在此先感谢您的任何答案。

我想讨论一下技术,我希望找到这个解决方案的最小侵入性和快速/最简单的开发时间。

+0

您可以在JavaScript中使用AsyncController中的计时器吗? – Silvermind 2012-03-16 10:20:45

+0

我不会太在意轮询和每3秒发出一次请求。其他解决方案似乎对我来说是一个矫枉过正。只需使用轮询,使用AJAX只刷新您需要的内容,如果需要,可以对其进行优化,以便在没有更改时发送小信息而不是全部数据。 – Arek 2012-03-16 10:26:31

+0

感谢大家。 这里的讨论已经打开了我的眼睛,用于共享解决方案,其中每X分钟将新数据拉入主页。 – Helbo 2012-03-20 10:07:53

回答

1

正如您已经确定的那样,您可以定期使用AJAX进行轮询以查看是否需要刷新。如果这听起来不太好,你可以尝试一种COMET方法,其中包括打开客户端和服务器都保持打开状态的请求,直到服务器收到消息。那时,它会发送一条消息给你希望的任何指令(如重新加载此页面)并结束连接,然后客户端脚本将对此消息进行处理。一个实际的例子是Facebook如何处理通知。最终的结果是您的服务器的流量减少,用户在客户端体验到神奇的“即时”响应。另一方面,这种方法需要在服务器和应用程序上进行适当的构建和调整,因为保持大量连接打开会产生问题。

There are some ASP.NET modules for implementing a COMET solution(和Signalr听起来像这样的解决方案之一),但我想知道为什么轮询选项是如此糟糕,如果你只在Intranet上使用它。您不一定需要在客户的几个独立区域进行投票;你可以有一个通知器(这里全是JS,介意你),它需要其他组件的订阅,这些组件提交他们希望你检查的东西的细节。然后通过一个包含所有相关订阅的消息,通过AJAX轮询一次MVC操作。我不认为这是一个大的网络破坏者,因为我有一个应用程序可以在相当大的范围内执行此操作。

在服务器端,您的操作会将该消息解析为作业,根据请求检查每个作业,并发送响应消息(如果有任何要执行的操作)。然后,您的客户端通知程序接收消息并将结果发送给任何订户(如果有任何事情需要做)(一个简单的例子:刷新页面,或者更恰当地说,刷新页面中发生更改的部分......您可以使用JavaScript-最好通过jQuery-用从您的MVC操作中检索到的HTML替换元素的内容来改变内容)。

听起来很复杂,但并不是真的,特别是与管理COMET解决方案相比,您可以使用现成的技术来完成此任务。你提到听起来像是使用WCF duplex service contract using a dual HTTP binding,这将允许服务器发起请求到客户端

Silverlight的技术。这当然是一种选择,因为您可以拥有一个Silverlight通知器应用程序,类似于我之前提到的,您可以坐在您的页面中,接收订阅者并从服务器接收推送消息。我没有机会在实际应用中实现双工服务,所以我不知道它在生产环境中的实用性。

0

如果你有填充值的图表,你希望它是最新的,在所有的时刻,那会不会对用户来说是非常混乱,如果数据在每一秒的变化?

我会实现一个JavaScript调用,将刷新某些股利每x秒,如setTimeout("Refresh()",2000);

你可以做的刷新方法Ajax调用,将返回一个局部视图图表。

相关问题