熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

ASP.NET自定義輸出緩存提供程序

2013-11-15 12:47:44  來源: ASP編程 

  我們知道自從ASPNET 發布以來頁輸出緩存使開發人員能夠把由網頁控件及HTTP響應等生成的輸出內容存儲到內存中這樣一來在後面的Web請求時系統能夠從內存檢索這些生成的輸出內容而不是從頭開始重新生成輸出從而使ASPNET可以更迅速地提供內容在性能上得到了很大的提高但是這種方法確有一個限制即生成的內容一定要存儲在內存中這樣一來服務器將承受巨大流量帶來的壓力輸出緩存消耗的內存與來自Web應用程序的其他部分的內存需求之間導致嚴重沖突
      針對上述情況ASPNET 針對輸出緩存增加了一個擴展點它能夠使你可以配置一個或多個自定義輸出緩存提供程序輸出緩存提供程序可以使用任何的存儲機制來存儲HTML內容這使得開發者有可能針對不同的持久性機制來創建自定義的輸出緩存提供程序其中可以包括本地或遠程磁盤數據庫雲存儲和分布式緩存引擎(如velocitymemcached)等等
      要實現自定義輸出緩存提供程序你可以通過從SystemWebCachingOutputCacheProvider類中派生一個類來創建自定義輸出緩存提供程序例如下面的MyOutputCacheProvider類就是派生自OutputCacheProvider類並創建了一個自定義輸出緩存提供程序如代碼清單所示
      代碼清單MyOutputCacheProvidercs
using System;

  using SystemCollectionsGeneric;

  using SystemIO;

  using SystemLinq;

  using SystemRuntimeSerializationFormattersBinary;

  using SystemTimers;

  using SystemWebCaching;

  using SystemCollectionsConcurrent;

  namespace __

  {

  public class MyOutputCacheProvider : OutputCacheProvider

  {

  private Timer timer;

  private string cachePath = C:\\Cache\\;

  private ConcurrentDictionary<string DateTime>

  cacheExpireList;

  private const string KEY_PREFIX = __outputCache_;

  public MyOutputCacheProvider()

  {

  cacheExpireList =

  new ConcurrentDictionary<string DateTime>();

  timer = new Timer();

  timerElapsed += (o e) =>

  {

  var discardedList = from cacheItem in cacheExpireList

  where cacheItemValue < DateTimeNow

  select cacheItem;

  foreach (var discarded in discardedList)

  {

  Remove(discardedKey);

  DateTime discardedDate;

  cacheExpireListTryRemove(discardedKey

  out discardedDate);

  }

  };

  timerStart();

  }

  /// <summary>

  /// 添加緩存

  /// </summary>

  /// <param name=key>緩存的鍵</param>

  /// <param name=entry>緩存的對象</param>

  /// <param name=utcExpiry>過期時間</param>

  /// <returns>返回緩存值</returns>

  public override object Add(string key object entry

  DateTime utcExpiry)

  {

  FileStream fs = new FileStream(

  StringFormat({}{}binary cachePath key)

  FileModeCreate FileAccessWrite);

  BinaryFormatter formatter = new BinaryFormatter();

  formatterSerialize(fs entry);

  fsClose();

  cacheExpireListTryAdd(key utcExpiryToLocalTime());

  return entry;

  }

  /// <summary>

  /// 獲得緩存值

  /// </summary>

  /// <param name=key>緩存鍵</param>

  /// <returns>緩存值</returns>

  public override object Get(string key)

  {

  string path =

  StringFormat({}{}binary cachePath key);

  if (FileExists(path))

  {

  FileStream fs = new FileStream(

  path FileModeOpen FileAccessRead);

  BinaryFormatter formatter = new BinaryFormatter();

  object result = formatterDeserialize(fs);

  fsClose();

  return result;

  }

  else

  {

  return null;

  }

  }

  /// <summary>

  /// 根據鍵移除緩存

  /// </summary>

  /// <param name=key>緩存鍵</param>

  public override void Remove(string key)

  {

  string path =

  StringFormat({}{}binary cachePath key);

  if (FileExists(path))

  {

  FileDelete(path);

  }

  }

  /// <summary>

  /// 設置緩存

  /// </summary>

  /// <param name=key>緩存的鍵</param>

  /// <param name=entry>緩存的對象</param>

  /// <param name=utcExpiry>過期時間</param>

  public override void Set(string key object entry

  DateTime utcExpiry)

  {

  string path =

  StringFormat({}{}binary cachePath key);

  FileStream fs = new FileStream(

  path FileModeCreate FileAccessWrite);

  BinaryFormatter formatter = new BinaryFormatter();

  formatterSerialize(fs entry);

  fsClose();

  cacheExpireListTryAdd(key utcExpiryToLocalTime());

  }

  }

  }
     在MyOutputCacheProvider類中我們重寫了OutputCacheProvider類的AddGetRemove與Set方法並將頁輸出緩存到C:\\Cache\\文件夾裡


     定義好MyOutputCacheProvider類之後你可以通過使用OutputCache元素的新的providers節在nfig文件中配置提供程序如下面的示例所示
<caching>

  <outputCache defaultProvider=AspNetInternalProvider>

  <providers>

  <add name=MyOutputCacheProvider

  type=__MyOutputCacheProvider/>

  </providers>

  </outputCache>

  </caching>
      默認情況下在ASPNET 中所有的HTTP響應生成的網頁以及控件都使用內存輸出緩存其中defaultProvider屬性被默認設置為AspNetInternalProvider當然你可以更改Web應用程序中所使用的默認的輸出緩存提供程序這是通過為defaultProvider指定一個不同的提供程序名稱實現的如下面的代碼所示
<caching>

  <outputCache defaultProvider=MyOutputCacheProvider>

  <providers>

  <add name=MyOutputCacheProvider

  type=__MyOutputCacheProvider/>

  </providers>

  </outputCache>

  </caching>
      此外還可以針對每個控件和每個請求選擇不同的輸出緩存提供程序為不同的Web用戶控件選擇不同的輸出緩存提供程序的最簡單的方法就是在用戶控件的指令中以聲明方式使用新的ProviderName屬性
     下面我們將在MyOutputCacheProviderUserControl用戶控件裡定義該輸出緩存提供程序如下面的代碼所示
<%@ Control Language=C# AutoEventWireup=true
 CodeBehind=MyOutputCacheProviderUserControlascxcs
 Inherits=__MyOutputCacheProviderUserControl %>
<%@ OutputCache Duration= VaryByParam=none ProviderName=MyOutputCacheProvider %>
<asp:Label ID=Label runat=server />
      MyOutputCacheProviderUserControlascxcs代碼如下所示
    
public partial class MyOutputCacheProviderUserControl :SystemWebUIUserControl
{
    protected void Page_Load(object sender EventArgs e)
    {
        thisLabelText=DateTimeNowToLongTimeString();
    }
}
      定義好MyOutputCacheProviderUserControl用戶控件之後下面我們繼續來定義一個測試頁面MyOutputCacheProviderWebFormaspx代碼如下所示
    
<%@ Page Language=C# AutoEventWireup=true

  CodeBehind=MyOutputCacheProviderWebFormaspxcs
 Inherits=__MyOutputCacheProviderWebForm %>
<%@ Register src=MyOutputCacheProviderUserControlascx
 tagname=MyOutputCacheProviderUserControl tagprefix=uc %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
 transitionaldtd>
<html xmlns=>
<head runat=server>
    <title></title>
</head>
<body>
    <form id=form runat=server>
    <div>
        <asp:Button ID=Button runat=server Text=刷新頁面 />
        <br />
        MyOutputCacheProviderUserControl
        <uc:MyOutputCacheProviderUserControl ID=MyOutputCacheProviderUserControl  runat=server />
            <br />
         MyOutputCacheProviderWebForm
        <asp:Label ID=Label runat=server Text=Label></asp:Label>
    </div>
    </form>
</body>
</html>
    MyOutputCacheProviderWebFormaspxcs代碼如下所示
public partial class MyOutputCacheProviderWebForm :

  SystemWebUIPage

  {

  protected void Page_Load(object sender EventArgs e)

  {

  thisLabelText=DateTimeNowToLongTimeString();

  }

  }


    運行MyOutputCacheProviderWebFormaspx頁面結果如圖所示

  \
                                                     圖示例運行結果
    打開C:\\Cache\\文件夾你就能夠看見所生成的緩存文件如圖所示
 

                                                    圖在本地磁盤生成的緩存文件
 

                                                 圖緩存文件內容
       這裡需要注意的是你只能在用戶控件中指定@ OutputCache指令的ProviderName屬性但在ASPX頁面是不允許你指定@ OutputCache指令的ProviderName屬性的因為在頁面中默認情況下會使用nfig中配置的defaultProvider


 

  雖然你不能夠以聲明的方式指定@ OutputCache指令的ProviderName屬性但你可以在Globalasax文件中通過重載GetOutputCacheProviderName(HttpContext context)方法以編程方式指定針對一個具體的請求使用哪一個提供程序如下面的代碼所示
public override string GetOutputCacheProviderName(HttpContext context)
{
    if (contextRequestPathEndsWith(MyOutputCacheProviderWebFormaspx))
    {
        return MyOutputCacheProvider;
    }
    else
    {
        return baseGetOutputCacheProviderName(context);
    }
}

  利用ASPNET 中增加的輸出緩存提供程序擴展你現在可以為你的Web站點采取更積極和更智能化的輸出緩存策略例如你可以把一個網站中的用戶訪問量占前十名的那些網頁緩存到內存中而把那些較低訪問量的網頁緩存到磁盤上


From:http://tw.wingwit.com/Article/program/ASP/201311/21654.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.