asp.net 抓取网页数据(ASP.NET2.0中新增的SqlCacheDependency特性使这成为了可能)

优采云 发布时间: 2022-03-13 14:09

  asp.net 抓取网页数据(ASP.NET2.0中新增的SqlCacheDependency特性使这成为了可能)

  ASP.NET中的Page Cache是​​一个非常有用的东西,只要简单的在页面顶部添加一个OutputCache标签,就可以让页面在指定的Duration内直接输出自动保存在缓存中的页面内容,无需需要让 ASP.NET 引擎再次执行页面代码。当然,节省执行时间并不是主要原因。主要原因是如果页面内容是从数据库中取出来的,那么连接数据库和取数据的步骤就可以省略。这带来的好处是巨大的。

  PageCache 有一个小问题。比如很多ASP.NET论坛的首页使用PageCache,所以一个版本发布的最新帖子不会立即反映在首页,需要等待一段时间。虽然有点不情愿,但在某些情况下(例如 eBay 用来显示物品拍卖状态的页面),这种延迟是不允许的。

  也就是说,ASP.NET中的Cache不能根据数据库中对应的数据自动改变,对应的Cache就过期了。ASP.NET 2.0 中的新 SqlCacheDependency 功能使这成为可能。. (当然,只要了解了ASP.NET2.0中的一般实现,就可以基于ASP.NET1.0实现这个特性,后面会总结对应的方法。)

  要在 ASP.NET 2.0 中应用 SqlCacheDependency 功能,步骤如下(基于您手头的 Whidbey PDC 版本):

  1、 使数据库支持SqlCacheDependency

  在.Net Framework1.2(一般是WINDOWS/Microsoft.NET/Framework/v1.2.30703)的安装目录下,有一个aspnet_regsqlcache.exe,这个命令行工具允许我们的 SqlServer 7.0 或 SqlServer 2000 支持 SqlCacheDependency 特性,

  首先:“aspnet_regsqlcache -S 服务器名 -U 登录ID -P 密码 -d 数据库名 -ed”,该命令使指定数据库支持SqlCacheDependency,

  然后我们添加要跟踪的数据表:“aspnet_regsqlcache -S 服务器名 -U 登录ID -P 密码 -d 数据库名 -t 要跟踪的数据表名 -et”,该命令启用指定表支持SqlCache 依赖关系。

  它在幕后做什么?

  首先,它在指定的数据库中创建一个新表,名为

  “AspNet_SqlCacheTablesForChangeNotification”,这个表有3个字段,“tableName”记录要跟踪的数据表的名称,“notificationCreated”记录开始跟踪的时间,“changeId”是一个int类型的字段,每当跟踪数据的数据表发生变化时,该字段的值加1。它还在指定的数据库中添加了几个存储过程,以允许ASP.NET引擎查询被跟踪数据表的状态。然后,它会在我们要跟踪的Table中添加几个Trigger,分别对应Insert、Update和Delete操作。这些Triggers的语句很简单,就是“AspNet_SqlCacheTablesForChangeNotification”中对应的“tableName”字段

  默认情况下,这个存储过程每 500 毫秒执行一次,但是这个间隔可以在 web.config 中修改。我的经验是,这个查询操作也是非常耗费资源的,呵呵。2、 web.config 配置 web.config 中的配置再简单不过了3、 在页面的 outputCache 标签中指定 SqlCacheDependency 属性: 只要在这个tracked上执行Insert、Update、Delete表操作,数据表上的Trigger会修改数据库中“AspNet_SqlCacheTablesForChangeNotification”表中对应记录对应的“changId”字段值,然后ASP.NET引擎获取新值就知道跟踪表已更改。,这会自动使该页面的缓存无效。下一个故事1、育空地区呢?从上面可以看出,SqlServer并没有内置自动跟踪数据表中的数据变化然后通知ASP.NET引擎的功能(这是肯定的,SqlServer早就出来了),所以 ASP.NET 2.0 开发团队人为地添加了自定义的 Table、Trigger、StoredProcedure 等来实现数据变化跟踪。

  育空地区不必再那么麻烦了。Yukon 有一个内置的通知传递服务。该服务会通过WebServer的80端口直接通知IIS内置的*敏*感*词*器,然后*敏*感*词*器会通知ASP.NET。而且你可以注意到,上面介绍的跟踪方法只能在表级别跟踪数据变化,也就是说,ASP.NET引擎只能知道最后某个表的数据发生了变化,以及发生了哪条记录。无法跟踪更改,但育空地区的通知传递服务可实现记录级跟踪。2、 可以在当前的 ASP.NET 上实现吗?当然,我们可以先按照上面提到的第一步(或者自己定义一套规则来跟踪数据库中Table数据的变化),把这些Tables添加进去,触发器等根据葫芦画。ASP.NET的PageCache有一个VaryByCustom属性,可以让我们自己定义“缓存过期”规则(准确的说,其实就是可以让我们自定义缓存页面的版本,但是也可以间接自定义。缓存是“过期”,呵呵),只要我们重写global.asa中的HttpApplication.GetVaryByCustomString()方法,这个方法查询数据库“AspNet_SqlCacheTablesForChangeNotification”(或者根据入参字符串,如“CheckDBTable=Users” ”一个自己定义的跟踪记录表),只需让GetVaryByCustomString()方法返回“changeId”字段的值即可。

  VaryByCustom 的用法在 MSDN 文档中有详细说明。下一章3、GolfClubShack演示程序在博客大厅前面的某篇文章文章中,提供了一个基于ASP.NET2.0的GolfClubShack站点演示程序,非常好东西,在里面可以看到ASP.NET2.0的很多特性的体现,包括SqlCacheDependency。网上完整的 ASP.NET 2.0 演示程序并不多。听说MS把IBuySpy移植到了ASP.NET 2.0。我不知道细节。而MS的AspNetForums 2.0在alpha阶段还是基于.Net Framework的1.1(以前我以为是基于最新的ASP.NET2.0,安装好了一半一天,晕……)。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线