前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET MVC编程——缓存

ASP.NET MVC编程——缓存

作者头像
甜橙很酸
发布2018-03-30 10:11:59
1.8K0
发布2018-03-30 10:11:59
举报
文章被收录于专栏:DOTNET

Web缓存分为服务端缓存和客户端缓存。

1 服务端缓存

1.1请求域内的缓存:HttpContext.Items

类型:

HttpContext.Items的类型为IDictionary,且键和值都是object类型

访问性:

只存在于当前请求范围内。

例:

代码语言:javascript
复制
HttpContext.Items["key"] ="value";
var value = HttpContext.Items["key"];

1.2用户域内的缓存:HttpContext.Session

类型:

HttpContext.Session的类型为HttpSessionStateBase,这个类继承自ICollection, IEnumerable,

访问性:

只针对当前用户有效,无法跨用户级别访问。

过期设置:

设置过期时间,当过期时间到达时,服务器便销毁存储在Session里的对象。

例:

代码语言:javascript
复制
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.Application,HttpContext.Cache

类型:

HttpContext.Application类型为HttpApplicationStateBase,此类继承自NameObjectCollectionBase, ICollection, IEnumerableHttpContext.Cache为Cache类型,此类继承自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参数指定依赖的策略。

例:

代码语言:javascript
复制
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 值,否则会抛出异常。

下面是该特性的定义。

代码语言:javascript
复制
[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; }
}

缓存位置枚举值为:

代码语言:javascript
复制
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操作为:

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

视图Index.cshtml为:

代码语言:javascript
复制
<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为:

代码语言:javascript
复制
@{
    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消息头

常用设置举例:

代码语言:javascript
复制
//设置是否可被客户端或代理缓存
Response.Cache.SetCacheability(HttpCacheability.Public);
//设置过期时间
Response.Cache.SetMaxAge(TimeSpan.FromMinutes(30));
//设置绝对过期时间
Response.Cache.SetExpires(DateTime.Now.AddMinutes(30));

验证缓存数据的有效性

通过服务端对http消息头进行设置,以便客户端可以验证数据有效性。

常用设置举例:

代码语言:javascript
复制
//设置Last-Modified HTTP标头
Response.Cache.SetLastModified(DateTime.Now);
//设置ETag HTTP标头
Response.Cache.SetETag(@"uni:version");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档