实时 ASP.NET MVC Web 应用程序
Posted
技术标签:
【中文标题】实时 ASP.NET MVC Web 应用程序【英文标题】:Real-time ASP.NET MVC Web Application 【发布时间】:2011-03-02 13:01:20 【问题描述】:我需要在我的网络应用程序中添加一个“实时”元素。基本上,我需要检测存储在 SQL Server 表中的“更改”,并在发生更改时更新 UI 的各个部分。
我目前正在通过投票进行此操作。我每 3 秒向服务器发送一个 ajax 请求,请求任何新的更改 - 然后返回并处理这些更改。它可以工作,但我不喜欢它——这意味着对于每个浏览器,我都会频繁地发出这些请求,而服务器总是忙于处理它们。简而言之,它不能很好地扩展。
是否有任何巧妙的替代方案可以避免轮询开销?
编辑
为了完整起见,我将更新此内容以提及我们最终采用的解决方案 - SignalR。它是操作系统,来自微软。它越来越受欢迎,我可以衷心推荐它,或者确实是我们也看过的 WebSync。
【问题讨论】:
***.com/questions/4555462/… 【参考方案1】:查看WebSync,这是一款专为 ASP.NET/IIS 设计的彗星服务器。
特别是,我会使用SQL Dependency 类,当您检测到更改时,使用RequestHandler.Publish("/channel", data); 将信息发送给适当的监听客户端。
应该很好用。
【讨论】:
公平地说,它非常棒(WebSync)。演示(尤其是地图之一 - 您需要为此打开 2 个浏览器窗口)非常简单但很有启发性 WebSync 看起来确实很酷,但理想情况下我想要一个免费的解决方案(或者更确切地说,客户想要一个免费的解决方案!)。 呵呵,够公平的 Jakub ;)。对于任何想知道他在说什么的人 - 我是 WebSync 的开发人员之一,受雇于 Frozen Mountain :)。不想在这里隐藏任何东西。 @Matt - 他们不总是这样吗? :) 问题是,什么是“免费的”——你的时间来实施,而不是购买现有的解决方案……似乎我一天要进行多次对话。但是,这可能是另一个地方的问题:-D 再看这个,我印象不错,正在等待老板关于购买可能性的回复:)【参考方案2】:直接取自 Jakub 引用的链接(即):
Reverse AJAX with IIS/ASP.NET
PokeIn on codeplex 为您提供增强的 JSON 功能,使您的服务器端对象在客户端可用。简单地说,它是一个反向 Ajax 库,可以轻松地从 C#/VB.NET 调用 javascript 函数并从 JavaScript 调用 C#/VB.NET 函数。它具有许多功能,如事件排序、资源管理、异常处理、编组、Ajax 上传控制、单声道兼容性、WCF 和 .NET 远程集成和可扩展的服务器推送。 此库有一个免费的社区许可选项,与其他许可选项相比,该许可选项非常划算。
我实际使用过这个,社区版非常特别。非常值得一看,因为这种技术将在未来几个月/几年内开始主导市场。 codeplex 站点带有完整的 asp.net mvc 示例。
【讨论】:
jakub - 真奇怪,我实际上在 10 分钟前访问了该链接 - 感谢您的提醒。已更改为直接 codeplex 项目链接【参考方案3】:无论如何:您将始终受限于 HTTP (大部分)是一条单行道这一事实。除非您在客户端上实现一些合理的代码(即侦听传入的网络请求),否则其他任何事情都将涉及轮询服务器以获取更新,无论其他人会告诉您什么。
我们有类似的要求:在我们的一个实时 Web 应用程序中具有非常快的响应时间,每台 Web 服务器为大约 400 到 500 个客户端提供服务。服务器需要几乎在 0.1 秒内通知客户端(电话和 VoIP)。
最后我们实现了Async Handler。在每个轮询请求上,我们将请求休眠 5 秒,等待信号量脉冲信号响应客户端。如果 5 秒结束,我们会以“无事件”响应,客户端将再次(立即)发布请求。这导致了非常快的响应时间,而且我们从来没有遇到过每台机器多达 500 个客户端的任何问题。不知道在轮询请求可能会产生问题之前我们还可以添加多少。
【讨论】:
这几乎就是我所做的。您最终会得到一个队列,您可以根据需要轮询并下拉事件。我很确定事实上这就是堆栈溢出的工作原理以及页面顶部“toast”的工作原理。 这听起来像是一个非常好的常识方法来解决无法确定的 ping .. 喜欢它 +1【参考方案4】:看看this article
我在某处(不记得在哪里)读到使用此 WCF 功能使主机进程以不消耗阻塞线程的方式处理请求。
【讨论】:
【参考方案5】:根据您的应用程序的限制,您可以使用 Silverlight 进行此连接。您不需要为 Silverlight 提供任何 UI,但您可以使用具有接受服务器端数据推送的连接的套接字。
【讨论】:
以上是关于实时 ASP.NET MVC Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?
ASP.NET MVC 在“发布”上应用 web.config 转换
有没有办法让 Asp.net 零公共站点(Asp.net MVC)中的实时登录用户?