天天看點

ASP.NET緩存依賴--自定義緩存依賴

       在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。是以,示例運作結果如圖所示:

ASP.NET緩存依賴--自定義緩存依賴

轉載于:https://www.cnblogs.com/madengwei/archive/2012/04/08/2438100.html