ASP.NET MVC如何使用输出缓存

通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用。至于数据缓存还是等我的下一篇文章吧,一步一步来不急的。
 
输出缓存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我这里以Action为示例

[OutputCache(Duration =20)]//设置过期时间为20秒
public ActionResult ExampleCache()
{
   var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
   ViewBag.timeStr = timeStr;
   return View();
}
我们在页面上可以很明显地看到:


在20秒时间差距内页面上的时间都不会被改变。他在Response Header中过期时间和上次修改的时间正好相隔20秒。Http StatusCode 304 这个我得简单介绍下,这个页面是缓存在客户端浏览器的,服务器在接收响应时(还没有超过20秒)并没有返回给浏览器一个新的html文档,只是告诉浏览器 No Modified,从本地去读取即可。当然有必要去了解一下304 ,介绍看看这篇文章http状态码304的介绍
在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。
 
Outputcache特性中可以加上一些参数,主要有这些
Outputcache重要的参数
int Durrtion 获取或设置缓存持续时间(以秒为单位)
bool NoStore 是否存储缓存,默认是false,当为true时http状态码就会变成200
string VaryByParam  获取或设置参数变化的值。不同的参数都会被缓存不同的文档,多个参数用逗号隔开,none、*(空、所有)
string CacheProfile 获取或设置缓存配置文件名称,也就是说在配置文件中设置缓存
string VaryByCustom 获取或设置基于自定义项变化的值,自定义任何输出缓存的文字,比较常用
 Location 枚举值 None不缓存,Server缓存在服务器端,Client缓存在浏览器,Any在浏览器、代理服务器、web服务器
string sqlDependency 获取或设置 SQL 依赖项,根据数据库的变化更新缓存
   
对于这些参数如何使用我就写几个例子,看看效果吧。

1.输出缓存CacheProfile使用配置文件设置缓存

这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些
<!---CacheProfile配置文件中设置缓存-->
<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/>
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>
<!---CacheProfile配置文件中设置缓存end-->
其实作用和效果还是一样,无非就是方便点,统一的配置参数都直接写webconfig文件里面。当然你也可以在Controller中写。看效果吧

2.输出缓存VarByParam参数的使用

简单点来说就是根据不同的参数值生成缓存。代码是这样的
[OutputCache(Duration =20,VaryByParam ="type,page")]
public ActionResult ExampleVaryByParam(string type,int page)
{
    ViewBag.type = type;
    ViewBag.page= page;
     return View();
}
通过页面上可以观察到,这是不符合缓存数据的更新的,在缓存持续的时间内,改变了参数值,但是Action并没有重新生成页面返回,但是浏览器的Http Status Code
还是200 ,所以只用VarByParam参数这种缓存是没有做到缓存数据的更新,这我就纳闷了。知道的可以告诉我一下。
但是如果只是设置一个参数的,当参数值发生变化时,缓存也发生变化。设置多个参数时直接用*表示,也是有缓存数据的更新的。

3.输出缓存VarByCustom参数的使用

输出缓存中VarBuCustome参数的主要作用是根据数据改变让客户端缓存过期并及时更新。
主要用于自定义输出缓存要求的任意文本。如果赋值该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义的字符串,则必须在应用程序的Global.asax文件中重写 Httpapplication GetVaryByCustomString方法。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
    //custom 是Outputcache中的参数VaryByCustom参数值 ,VaryByCustome为*代指所有参数
    if (custom == "type")
    {
       return context.Request.AnonymousID; //返回的这个字符串会与当前Action的缓存比较,字符串不一致则更新缓存。
     }
     return base.GetVaryByCustomString(context, custom);
}
特性
[OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)]
public ActionResult ExampleVaryByCustom(string type)
{
     ViewBag.type = type;
     return View();
}
通过观察实现的效果很明显:在缓存持续的时间内,type参数值没有改变时 status Code 还是304 ,参数值发生改变时则是200重新生成页面了。
从这个即时更新的缓存来说已经达到要求了,当然这从业务上来说还是不够的。
可以得出的缓存结果,整个更新缓存的机制是 发现参数值不同便重新生成视图,就可以做到缓存的更新(当然更深入的缓存机制我也不知道,欢迎批评)
 

4.输出缓存SqlDependency的使用

首先我们还是来学习一下如何启用数据库缓存依赖项。

运行cmd命令: cd C:WindowsMicrosoft.NETFrameworkv4.0.30319

 运行相关命令: aspnet_regsql -S .  -U sa -P 123456  -ed -d 数据库名 -et -t 表名

解释一下 

注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名数据库名 
列出已注册表:aspnet_regsql -S . -E -d 数据库名 -lt

如图:

现在我们已经开启数据库的缓存依赖,我们继续在webconfig这样配置。
<!---CacheProfile配置文件中设置缓存-->
<caching>   
<!--缓存的数据库依赖-->
<sqlCacheDependency>
<databases>
<add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/>
<!--name:配置sqlDependency会用到,connectionStringName:数据库连接字符串的名称,pollTime:监听数据库变化的间隔时间,以毫秒为单位。即每隔1秒钟去监听数据库中的表Product是否有变化-->
</databases>
</sqlCacheDependency>
<outputCacheSettings>
<outputCacheProfiles>
<!--<add name="exampleCacheProfile" duration="100"  location="Any" enabled="true"/>-->
<add name="exampleSqlDependency" duration="20"  location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/>
<!--sqlDenpendency:数据依赖节点名称+冒号+数据库表名(区分大小写)-->
</outputCacheProfiles>
</outputCacheSettings>
</caching> 
<!---CacheProfile配置文件中设置缓存end-->

当然还有数据库连接字符串,还是贴出来吧

<code class="language-html">  <connectionStrings>  
<!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)MSSQLLocalDB;AttachDbFilename=|DataDirectory|aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providerName="System.Data.SqlClient" />-->  
<add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>  
</connectionStrings>

为了看到效果可以在在视图中加个时间

[OutputCache(CacheProfile = "exampleSqlDependency")]
public ActionResult ExampleSqlDependency()
{
      ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
      return View();

}

所实现的效果是:数据库的Product表数据没有任何变化时,20秒的缓存持续时间内,这个时间是不会变化的,也就是从浏览器缓存中去读取http Status Code 为304。

当Product有数据变化时,这个时间刷新成当前时间,也就是Action从新生成了Html文档返回给浏览器。

5.总结

输出缓存在实际的应用中还是需要自己去体会。在业务逻辑的处理中才更能体会到缓存的重要性。当然数据缓存也很重要,应用非常广泛,所以还是有必要去掌握。写的不足的地方希望给个评论指点一二。

原文地址:https://www.cnblogs.com/wangwust/p/9359312.html