在ASP.NET中,它允許你繼承CacheDependency類建立自定義的緩存依賴,這和上一節所講的SqlCacheDependency類所做的差不多。設計一個自定義的CacheDependency類很簡單,你要做的隻是啟動一個異步任務,它檢查依賴項目何時發生變化。依賴項目發生變化時,将調用基方法CacheDependency.NotifyDependencyChanged。作為回應,基類更新HasChanged與UTclastModified屬性值,并且ASP.NET自動從緩存中移除所有相關項目。
我們知道,現在的許多網站都提供了RSS功能,進而友善我們去訂閱。是以,在我們的應用程式裡訂閱這些RSS的時候,你可以在緩存中放置 RSS 資料,顯示的時候使用一個樣式轉換。而在檢查依賴性的時候,我們隻需要簡單地比較一下目前的 RSS 與網站的 RSS 是否相同就可以了。
那麼我們該何時去檢查比較這些RSS資料呢?其實,你可以使用一個 Timer 來控制,讓它定期去檢查一個是否有更新,如果有更新則通知依賴發生了改變。
此外為了便于重用,我們需要在自定義的緩存依賴類MyCacheDependency中定義一個url變量,用來儲存我們要擷取的 RSS 資料的 URL。還需要定義一個時間間隔timeInterval,便于在使用的時候調整重新整理速度。詳細代碼如代碼清單19-3所示:
代碼清單19-3:MyCacheDependency.cs
using System;
using System.Collections.Generic;
using System.Xml.XPath;
using System.Web;
using System.Web.Caching;
using System.Threading;
namespace _19_1
{
public class MyCacheDependency : CacheDependency
{
private Timer _timer;
private int _timeInterval;
private XPathNavigator _rss;
private string _url;
private int _pollTime = 5000;
public XPathNavigator RSS
{
get
{
return _rss;
}
}
public MyCacheDependency( string url, int timeInterval)
{
_url = url;
_timeInterval = timeInterval;
_rss = GetRSS();
_timer = new Timer(
new TimerCallback(CheckDependencyCallback),
this, _timeInterval * _pollTime,
_timeInterval * _pollTime);
}
private XPathNavigator GetRSS()
{
XPathDocument doc = new XPathDocument(_url);
return doc.CreateNavigator();
}
public void CheckDependencyCallback( object sender)
{
XPathNavigator nav = GetRSS();
if (nav.OuterXml != _rss.OuterXml)
{
base.NotifyDependencyChanged( this,
EventArgs.Empty);
_timer.Dispose();
}
}
protected override void DependencyDispose()
{
if (_timer != null)
{
_timer.Dispose();
}
}
}
}
在MyCacheDependency類中,我們在CheckDependencyCallback方法裡将兩個 RSS 資訊進行比較,如果不同,則調用 NotifyDependencyChanged 方法通知基類,相應的緩存依賴已經發生了變化,緩存中的資料應當被清除。
與此同時,在本類的最後還重寫了DependencyDispose方法執行所有必需的清理工作。使用NotifyDependencyChanged方法使緩存的項目失效之後,很快就會調用DependencyDispose方法。此時,已經不再需要依賴了。
MyCacheDependency類的測試頁面MyCacheDependencyWebForm.aspx 如代碼清單19-4所示:
代碼清單19-4:MyCacheDependencyWebForm.aspx
<%@ Page Language= " C# " AutoEventWireup= " true "
CodeBehind= " MyCacheDependencyWebForm.aspx.cs "
Inherits= " _19_1.MyCacheDependencyWebForm " %>
<!DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN "
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= " http://www.w3.org/1999/xhtml ">
<head runat= " server ">
<title></title>
</head>
<body>
<form id= " form1 " runat= " server ">
<div>
部落格園最新貼子:
<br />
<asp:Xml ID= " RssXml " runat= " server " />
<br />
<asp:Label ID= " Label1 " runat= " server " ForeColor= " red " />
</div>
</form>
</body>
</html>
在頁面的背景代碼裡,我們首先需要判斷RSS緩存項Cache["Key"]是否存在。如果Cache["Key"]為null,則調用MyCacheDependency類來建立一個緩存項,最後将緩存項綁定到RssXml控件上。如下面的代碼所示:
public partial class MyCacheDependencyWebForm : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
string url = " http://www.cnblogs.com/RSS.aspx ";
if (Cache[ " Key "] == null)
{
MyCacheDependency dependency =
new MyCacheDependency(url, 500);
Cache.Insert( " Key ", dependency.RSS, dependency);
Label1.Text = " 目前資料為剛剛擷取,并已更新入緩存! ";
}
else
{
Label1.Text = " 目前資料系從緩存中取得! ";
}
RssXml.XPathNavigator = Cache[ " Key "] as
System.Xml.XPath.XPathNavigator;
RssXml.TransformSource= " translate.xsl ";
}
}
其中,translate.xsl檔案代碼如下所示:
<xsl:stylesheet
xmlns:xsl= " http://www.w3.org/1999/XSL/Transform " version= " 1.0 "
xmlns:myns= " http://www.comesns.com/sample ">
<xsl:template match= " channel ">
<div style= " background-color:#cccccc; font-size :12px; ">
<xsl: for-each select= " item ">
<a>
<xsl:attribute name= " href ">
<xsl:value-of select= " link "/>
</xsl:attribute>
<xsl:value-of select= " title "/>
</a>
<br />
</xsl: for-each>
</div>
</xsl:template>
</xsl:stylesheet>
因為在MyCacheDependencyWebForm頁面中,我們給MyCacheDependency類傳入的url是http://www.cnblogs.com/RSS.aspx。是以,示例運作結果如圖所示:
轉載于:https://www.cnblogs.com/madengwei/archive/2012/04/08/2438100.html