使用SqlCacheDependency获取实时更新? - ASP.NET

时间:2010-01-09 14:01:03

标签: .net asp.net polling long-polling

我想在网页上显示实时更新(基于数据库表中由外部进程更改的状态字段)。根据我的研究,有几种方法可以做到这一点。

  • 长轮询(Comet) - 这似乎很难实现
  • 定期轮询 - 我可以使用AJAX方法每隔5秒触发一次数据库命中以获取当前状态。但我担心这会有性能问题。

然后我读到了使用SqlCacheDependency - 基本上缓存根据表中的字段失效。我假设我可以在缓存无效时使用trigerred事件来向用户显示新的更新?

什么是不容易出现性能问题的简单解决方案?

2 个答案:

答案 0 :(得分:1)

不是轮询数据库,而是一种更具伸缩性和性能的方法,就是在Web服务器上查询文件的存在,就像轻量级的js文件。 该文件的内容并不重要,但为了让您了解您可以拥有某种类型的JSON对象,该对象更详细地描述了该过程的结果。

然后,作为最后一步进行处理的后台进程可以在您的Web层上创建文件或调用Web服务来执行此操作。

以下是它的工作原理。

用户按下发布到服务器的按钮

服务器启动进程并返回标识符,例如C3201620-E622-4fe2-9F3A-E02FFA613F59

然后,Web UI会轮流查看C3201620-E622-4fe2-9F3A-E02FFA613F59.js的存在,javascript将管理404错误并继续重试,直到收到200

希望这会给你一些想法。

在jQuery中处理404的代码示例

$.ajax({
        url: '/CheckForStatusChange/C3201620-E622-4fe2-9F3A-E02FFA613F59.json',
        type: "GET",
        success: function(result) {

        },
        error: function(request, status, error) {
        //handle error here and setTimeOut                 

        }); 

答案 1 :(得分:0)

你有两个问题:

  1. 检索要推送的数据
  2. 将数据推送到客户端
  3. 项目#1很简单,假设您有一个相当高效的查询,并且您没有为每个用户查询它;只需查询,获取数据并推送它。您可以使用SqlDependency选项,或者您可以只轮询它;这取决于你的数据有多重。

    项目#2有点棘手,因为你需要经常点击服务器,或者使用彗星服务器。我们在Frozen Mountain编写了一个高度可扩展的.NET彗星服务器WebSync,可能符合要求。从本质上讲,您有一个单独的流程来驱动发布,而WebSync将处理将数据推送到您的客户端。