MVC4的缓存

来源:互联网 发布:mac版千牛怎么更新 编辑:程序博客网 时间:2024/04/30 20:46

     要点概要

 

   1.OutputCache 属性 contact.cshtml

   [OutputCache(Duration=10)]

         public ActionResult Contact()

  {
      ViewBag.Message ="Your contact page.";
      returnView();
  }

       action 结果会缓存10秒钟

 
2.带参数的OutputCache
[OutputCache(Duration=3600, VaryByParam="searchTerm")]
publicActionResult Contact(stringsearchTerm)
 
 如:http://localhost:xxxx/Home/Contact?searchTerm=a,这个结果就会缓存一个小时.下次访问相同的链接,缓存期内则会返回缓存结果, 下一步如果换成
 http://localhost:xxxx/Home/Contact?searchTerm=b呢?程序会执行action,并将结果缓存,此时再访问http://localhost:xxxx/Home/Contact?searchTerm=a,
 会返还a的缓存结果,这里缓存了两个不同的结果,就是会根据searchTerm的不同值进行对应的缓存。
 
 
 如果想对每个不同的参数进行缓存,可以设置varbyparam="*";如果对任何参数都缓存相同的结果,可以设置varbyparam=“none”
 
 
3.缓存child action  partialviewtest.cshtml
 
  
  <p>
    This is a partial view.
  </p>
 
publicActionResult PartialViewTest()
{
    returnView();
}
 
    contact.cshtml中,加入如下代码@Html.Action("PartialViewTest")
  
    在partialviewtest action上加入[OutputCache(Duration=3600)]设置,partialviewtest的缓存时间不会受contact action缓存时间的影响
 
4 指定缓存位置Specify the cache location
    [OutputCache(Duration = 3600, Location=System.Web.UI.OutputCacheLocation.ServerAndClient)]
   
    默认值是serverandclient
 
5.根据header值进行缓存
  例如多区域语言情况下 [OutputCache(Duration = 3600, VaryByHeader="Accept-Language")],可以根据不同的语言进行缓存。
  

other type of header value will be important for AJAX requests. Let’s imagine that the Contact action is also available to AJAX calls. In other words only that portion of the screen will be refreshed which makes up the View result of the Contact action. The rest, i.e. the header, footer, menu etc. will stay constant. If a user then bookmarks a specific search result, e.g.:

http://localhost:xxxx/Home/Contact?searchTerm=a

…and will call this search directly from his/her browser then the Contact action will only serve up a cached version of the Contact view and nothing else. The reason is that user’s browser will send a full GET request and not an asynchronous one. All the other parts of the ‘normal’ full screen, i.e. everything that the AJAX call didn’t touch will be left out. The result will be very weird: a page devoid of styles – apart from any inline style tags in the Contact view – headers, footers etc. The problem lies with a specific header value: X-Requested-With. This is the only difference between the headers of the AJAX and the GET calls: it will be present on an AJAX request but absent on GET requests. To the caching engine there’s no difference between AJAX calls and GET calls because you didn’t specify this in the OutputCache attribute. Two things need to be done:

1. Update the OutputCache attribute to vary the output by this specific header type:

1
[OutputCache(Duration = 3600, VaryByHeader="X-Requested-With")]

Now the caching mechanism will be able to differentiate between two requests: one that wants a full page render and one that will only serve a portion of the page.

Unfortunately there are cases when this update is not enough. The default setting is that we’re letting the action result be cached on both the client and the server. However, some older browsers are not “clever” enough to detect the difference between full GET and partial AJAX requests.

2. To be on the safe side we need to specify that caching only should occur on the server:

You can achieve this as follows:

1
[OutputCache(Duration = 3600, VaryByHeader="X-Requested-With", Location=System.Web.UI.OutputCacheLocation.Server)]

Now the server will send instructions to the browser not to cache the action result. The browser will always have to access the server for a response. The server will then serve up a cached result if there’s any in its memory.

The safest and most elegant solution is of course to create separate action methods for full GET and partial AJAX calls 

6 sql缓存依赖 Sql dependency caching
  有个叫SqlDependency的OutputCache的参数,可以用来指定当一个数据库表的的内容发生改变后进行缓存刷新,这个听起来很不错,但是使用很少,原因是在sql查询语句 类型方面有一些限制。
7 自定义缓存
   可以使用VaryByCustom进行自定义缓存机制,详细内容参考msdn
8 缓存配置
 
  上述过多的使用硬编码的,如果缓存策略有变化,你不得不去一一更改,再发布代码,更好的方法是在web.config文件中进行配置。
<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <addname="Aggressive"duration="1600"/>
      <addname="Short"duration="20"/>
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>
可以这样使用:
 [OutputCache(CacheProfile="Aggressive")]
 
 
原创粉丝点击