ASP.NET MVC編程——緩存


Web緩存分為服務端緩存和客戶端緩存。

1 服務端緩存

1.1請求域內的緩存:HttpContext.Items

類型:

HttpContext.Items的類型為IDictionary且鍵和值都是object類型

訪問性:

只存在於當前請求范圍內。

例:

HttpContext.Items["key"] ="value";
var value = HttpContext.Items["key"];

 

1.2用戶域內的緩存:HttpContext.Session

類型:

HttpContext.Session的類型為HttpSessionStateBase這個類繼承自ICollection, IEnumerable

訪問性:

只針對當前用戶有效,無法跨用戶級別訪問。

過期設置:

設置過期時間,當過期時間到達時,服務器便銷毀存儲在Session里的對象。

例:

HttpContext.Session["key"] = "value";
var value = (string)HttpContext.Session["key"];
//設置超時時間為20分鍾
HttpContext.Session.Timeout = 20;
或配置
<system.web> <sessionState timeout="20" /> </system.web>

 

1.3應用程序域內的緩存:HttpContext.ApplicationHttpContext.Cache

類型:

HttpContext.Application類型為HttpApplicationStateBase此類繼承自NameObjectCollectionBase, ICollection, IEnumerableHttpContext.CacheCache類型,此類繼承自IEnumerable

訪問性:

他們的生命周期和IIS工作進程一樣長,但HttpContext.Cache不能跨工作進程。

過期機制:

HttpContext.Cache可以對緩存數據設置過期機制,有兩種方式:一是最后一次訪問之后多長時間過期,另一種是設定過期時間點。這兩種過期策略不能同時使用。

緩存依賴:

Cache提供了下面的方法來設置緩存依賴

public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)

或者添加值的時候設置緩存依賴:

public void Insert(string key, object value, CacheDependency dependencies);

其中我們可以通過dependencies參數指定依賴的策略。

 

例:

HttpContext.Application["key"] = "value";
var value = (string)HttpContext.Application["key"];
HttpContext.Cache["key"] = "value";
var value = (string)HttpContext.Cache["key"];

 

1.4輸出緩存

使用OutputCacheAttribute屬性將控制器操作渲染的操作結果保存到緩存過濾器。可以利用它實現甜甜圈洞緩存,即緩存部分內容,而允許外圍數據變化。使用此特性的時候要注意:子操作的 OutputCacheAttribute 僅支持 Duration、VaryByCustom 和 VaryByParam 值。不能為子操作設置 CacheProfile、Location、NoStore、SqlDependency、VaryByContentEncoding 或 VaryByHeader 值,否則會拋出異常。

下面是該特性的定義。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter
{
    //獲取或設置緩存持續時間(以秒為單位)
    public int Duration { get; set; }
    //獲取或設置數據存儲位置
    public OutputCacheLocation Location { get; set; }
    //是否存儲緩存
    public bool NoStore { get; set; }
    //獲取或設置基於參數變化的值
    public string VaryByParam { get; set; }
}

 

緩存位置枚舉值為:

public enum OutputCacheLocation
{      
        //輸出緩存可位於產生請求的瀏覽器客戶端、參與請求的代理服務器(或任何其他服務器)或處理請求的服務器上。 此值對應於 System.Web.HttpCacheability.Public枚舉值。
        Any = 0,
        //輸出緩存位於產生請求的瀏覽器客戶端上。 此值對應於System.Web.HttpCacheability.Private 枚舉值。
        Client = 1,        
        //輸出緩存可存儲在任何 HTTP 1.1 可緩存設備中,源服務器除外。 這包括代理服務器和發出請求的客戶端。
        Downstream = 2,        
        //輸出緩存位於處理請求的 Web 服務器上。 此值對應於 System.Web.HttpCacheability.Server 枚舉值。
        Server = 3,       
        //對於請求的頁,禁用輸出緩存。 此值對應於 System.Web.HttpCacheability.NoCache 枚舉值。
        None = 4,      
        //輸出緩存只能存儲在源服務器或發出請求的客戶端中。 代理服務器不能緩存響應。 此值對應於 System.Web.HttpCacheability.Private和 System.Web.HttpCacheability.Server 枚舉值的組合。
        ServerAndClient = 5,
}

 

例:

控制器Home的CacheExe操作為:

[OutputCache(Duration=20)]
public ActionResult CacheExe()
{
    ViewBag.TimeNow = DateTime.Now.ToString("yyyyMMdd     hh:mm:ss");
    return View();
}

視圖Index.cshtml為:

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="http://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
</div>
<div class=”part”>
    @Html.Action("CacheExe")
</div>
<div class="row">
......
</div>

視圖CacheExe.cshtml為:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
    <h1>@ViewBag.TimeNow</h1>
    </div>
</body>
</html>

分析:

當渲染頁面時,class為part的<div>部分從緩存中取值,其他部分動態變化。由於CacheExe操作每調用一次就會計算一次當前時間,並將其付給ViewBag.TimeNow那么如果在20s內刷新一次頁面,顯示的時間不變的話,就如我們設想的那樣,系統將子操作調用的視圖緩存了起來,過期時間為這里設置的20s

1.5甜甜圈緩存

只緩存頁面的外圍部分,允許一部分內容動態變化。

ASP.NET MVC 不支持甜甜圈緩存,使用MvcDonutCachingNuGet包擴展了HTML方法,支持這種緩存方式。

 

2客戶端緩存

瀏覽器緩存

瀏覽器將從服務器獲取的資源保存到本地,然后當再次發起請求並且請求url與以往請求url之一相同時,瀏覽器會優先查看本地磁盤,加載本地緩存資源。如果請求url不同,那么瀏覽器會獲取網絡資源。

在服務器端設置http消息頭

常用設置舉例:

//設置是否可被客戶端或代理緩存
Response.Cache.SetCacheability(HttpCacheability.Public);
//設置過期時間
Response.Cache.SetMaxAge(TimeSpan.FromMinutes(30));
//設置絕對過期時間
Response.Cache.SetExpires(DateTime.Now.AddMinutes(30));

 

驗證緩存數據的有效性

通過服務端對http消息頭進行設置,以便客戶端可以驗證數據有效性。

常用設置舉例:

//設置Last-Modified HTTP標頭
Response.Cache.SetLastModified(DateTime.Now);
//設置ETag HTTP標頭
Response.Cache.SetETag(@"uni:version");

 

轉載與引用請注明出處。

時間倉促,水平有限,如有不當之處,歡迎指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM