OutPutCache 是调用ASP.NET 的 Cache对象实现的(至少服务端缓存是这样的)。(https://www.cnblogs.com/nigthcat/articles/10797064.html)

以下内容来自官网翻译而来:https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs

开启 Output Caching

可以通过向单个控制器动作或整个控制器类添加[OutputCache]特性来启用输出缓存。例如,Listing1中的控制器公开了一个名为Index()的操作。Index()操作的输出缓存10秒。但并不能保证在指定的时间内一定使用缓存内容。当内存资源变低时,缓存开始自动驱逐内容。

Listing 1 – Controllers\HomeController.cs

using System.Web.Mvc;namespace MvcApplication1.Controllers
{[HandleError]public class HomeController : Controller{[OutputCache(Duration=10, VaryByParam="none")]public ActionResult Index(){return View();}        }
}

Listing 2 – Views\Home\Index.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>Index</title>
</head>
<body><div>    The current time is: <%= DateTime.Now.ToString("T") %>    </div>
</body>
</html>

Figure 1 – Cached Index view

如果多次调用Index()操作,在浏览器的地址栏中输入URL /Home/Index并反复点击浏览器中的Refresh/Reload按钮,那么Index视图显示的时间在10秒内不会改变。因为缓存了视图,所以显示了相同的时间。

为访问您的应用程序的每个人缓存相同的视图,理解这一点很重要。任何调用Index()操作的人都将获得索引视图的相同缓存版本。

不要在MVC视图中使用page <%@ OutputCache %>指令。这个指令是在WebForm中使用的

(WebForm中的例子:https://www.cnblogs.com/nigthcat/articles/10797064.html)

缓存内容的地方

默认情况下,当您使用[OutputCache]属性时,内容被缓存在三个位置:web服务器、任何代理服务器和web浏览器。您可以通过修改[OutputCache]特性的Location属性来精确地控制缓存内容的位置。

您可以将Location属性设置为以下任意一个值:

· Any

· Client

· Downstream

· Server

· None

· ServerAndClient

默认情况下,Location属性的值为Any。但是,在某些情况下,您可能希望仅在浏览器或服务器上进行缓存。例如,如果您正在缓存针对每个用户的个性化信息,那么就不应该在服务器上缓存这些信息。如果要向不同的用户显示不同的信息,那么应该只在客户机上缓存这些信息。

例如,Listing 3中的控制器公开了一个名为GetName()的操作,该操作返回当前用户名。如果Jack登录到网站并调用GetName()操作,那么该操作将返回字符串“Hi Jack”。随后,如果Jill登录到网站并调用GetName()操作,那么她也将获得字符串“Hi Jack”。在Jack最初调用控制器操作之后,该字符串将为所有用户缓存在web服务器上。

Listing 3 – Controllers\BadUserController.cs

using System.Web.Mvc;
using System.Web.UI;namespace MvcApplication1.Controllers
{public class BadUserController : Controller{[OutputCache(Duration = 3600, VaryByParam = "none")]public string GetName(){return "Hi " + User.Identity.Name;}}
}

您不希望向Jill显示“Hi Jack”消息。

永远不要在服务器缓存中缓存个性化内容。但是,您可能希望在浏览器缓存中缓存个性化内容以提高性能。如果您在浏览器中缓存内容,并且用户多次调用相同的控制器操作,那么可以从浏览器缓存而不是服务器检索内容。

Listing 4中修改后的控制器缓存GetName()操作的输出。但是,内容只缓存在浏览器上,而不在服务器上。这样,当多个用户调用GetName()方法时,每个人都得到自己的用户名,而不是其他人的用户名。

Listing 4 – Controllers\UserController.cs

using System.Web.Mvc;
using System.Web.UI;namespace MvcApplication1.Controllers
{public class UserController : Controller{[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]public string GetName(){return "Hi " + User.Identity.Name;}}
}

注意,清单4中的[OutputCache]属性包括一个设置为OutputCacheLocation.Client值的Location属性。属性还包括一个NoStore属性。NoStore属性用于通知代理服务器和浏览器不应该存储缓存内容的永久副本。

Varying the Output Cache

在某些情况下,您可能希望对完全相同的内容使用不同的缓存版本。例如,假设您正在创建一个母版/细节页。母版页显示电影标题列表。当您单击标题时,您将获得所选影片的详细信息。

如果您缓存了“详细信息”页面,那么无论您单击哪个影片,都将显示同一影片的“详细信息”。第一个用户选择的第一个电影将显示给所有未来的用户。

您可以通过利用[OutputCache]特性的VaryByParam属性来解决这个问题。当表单参数或查询字符串参数发生变化时,此属性允许您创建相同内容的不同缓存版本。

例如,Listing 5中的控制器公开了名为Master()和Details()的两个Action。Master()操作返回一个电影“标题列表”,Details()操作返回所选电影的“详细信息”。

Listing 5 – Controllers\MoviesController.cs

using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;namespace MvcApplication1.Controllers
{public class MoviesController : Controller{private MovieDataContext _dataContext;public MoviesController(){_dataContext = new MovieDataContext();}[OutputCache(Duration=int.MaxValue, VaryByParam="none")]public ActionResult Master(){ViewData.Model = (from m in _dataContext.Movies select m).ToList();return View();}[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]public ActionResult Details(int id){ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);return View();}}
}

Master()操作包括一个值为“none”的VaryByParam属性。当调用Master()操作时,将返回相同的缓存版本的主视图。任何表单参数或查询字符串参数都将被忽略(参见Figure 2)。

Figure 2 – The /Movies/Master view

Figure 3 – The /Movies/Details view

Details() Action包括一个值为“Id”的VaryByParam属性。当将Id参数的不同值传递给控制器的Action时,将生成Details视图的不同缓存版本。

使用VaryByParam属性会导致更多缓存,而不是更少缓存,理解这一点很重要。将为Id参数的每个不同版本创建“详细信息”视图的不同缓存版本。

您可以将VaryByParam属性设置为以下值:

* = 每当表单或查询字符串参数发生变化时,创建不同的缓存版本。

none = 永远不要创建不同的缓存版本

参数的分号列表 =每当列表中的表单或查询字符串参数发生变化时,创建不同的缓存版本

创建缓存Profile配置

除了通过修改[OutputCache]特性的属性来配置输出缓存属性外,您还可以在web配置文件(web.config)中创建一个缓存Profile配置。在web配置文件中创建缓存配置有两个重要的优点。

首先,通过在web配置文件中配置输出缓存,您可以在一个中心位置控制控制器如何缓存内容。您可以创建一个缓存配置,并将该配置应用于多个控制器或控制器Action。

其次,您可以修改web配置文件,而无需重新编译应用程序。如果需要为已经部署到生产环境中的应用程序禁用缓存,那么只需修改web配置文件中定义的缓存配置即可。对web配置文件的任何更改都将被自动检测并应用。

例如,Listing 6中的<caching> web配置部分定义了一个名为Cache1Hour的缓存配置文件。<caching>部分必须出现在配置文件的<system.web>部分。

Listing 6 – Caching section for web.config

<caching>
<outputCacheSettings><outputCacheProfiles><add name="Cache1Hour" duration="3600" varyByParam="none"/></outputCacheProfiles>
</outputCacheSettings>
</caching>

Listing 7中的控制器演示了如何将Cache1Hour配置应用到带有[OutputCache]特性的控制器Action上。

Listing 7 – Controllers\ProfileController.cs

using System;
using System.Web.Mvc;namespace MvcApplication1.Controllers
{public class ProfileController : Controller{[OutputCache(CacheProfile="Cache1Hour")]public string Index(){return DateTime.Now.ToString("T");}}
}

如果调用Listing 7中控制器公开的Index() Action,那么在1小时内返回相同的时间值。

总结

Output caching为您提供了一种非常简单的方法,可以显著提高ASP.NET MVC应用程序的性能。在本教程中,您学习了如何使用[OutputCache]特性来缓存控制器Action的输出。您还学习了如何修改[OutputCache]特性的属性(比如Duration和VaryByParam属性),以修改内容的缓存方式。最后,您学习了如何在web配置文件中定义缓存配置。

ASP.Net中的缓存特性OutPutCache相关推荐

  1. Asp.Net中MVC缓存详解

    本文通过介绍了Asp.Net中MVC缓存的种类,以及他们之间的区别等内容,让学习者能够深入的了解MVC缓存的原理机制,以下是具体内容: 缓存是一种保存资源副本并在下次请求时直接使用该副本的技术.当 w ...

  2. ASP.NET中数据缓存

    缓存 缓存:把数据放到内存里面,下次请求的时候,直接从内存中读取数据返回给客户端就可以了,不用再去访问数据库了或磁盘.也就是内 存空间换去磁盘读取数据的时间. 缓存就是把你要访问的资源放在内存中,占用 ...

  3. 第一次来,试发一帖!--ASP.NET 2.0 中的SqlCacheDependency特性

    ASP.NET中的Page Cache是个很有用的东东,只要简单的在页面上方加上一个OutputCache标签,就可以让页面在制定的Duration内直接把自动保存在缓存中的页面内容输出,而不需要让A ...

  4. ASP.NET 2.0 中的SqlCacheDependency特性

    ASP.NET中的Page Cache是个很有用的东东,只要简单的在页面上方加上一个OutputCache标签,就可以让页面在制定的Duration内直接把自动保存在缓存中的页面内容输出,而不需要让A ...

  5. asp.net中缓存的使用介绍一

    介绍: 在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理.每个人都会用不同的方法去解决如何在IE在管理数据.有的会提到用状态管理,有的提到的cache管理,这里我比较喜欢cac ...

  6. 我用ASP.NET缓存之OutputCache

    [我的理解]页面缓存常用在网站上.Web应用系统上也用,但由于Web系统常与数据库打交道.时效性要求蛮强的,所以是否能用缓存得具体情况具体分析(很喜欢这句话"具体情况具体分析",很 ...

  7. cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...

    本文申明:本人凭着对英文和技术的热爱,根据自己有限的英文水平通过翻译文章以达到提高自身能力,如果有什么地方不对的,希望大家提意见. 目的:这篇文章将描述在asp.net中如何管理cache以及cach ...

  8. 浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...

  9. ASP.NET中使用Cache类来缓存页面的信息

    场景 ASP.NET中新建Web网站并部署到IIS上(详细图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107199 ...

最新文章

  1. 锐捷设备常用命令大全
  2. 欧拉函数(Euler_Function)
  3. 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
  4. 【边缘检测】RCF: Richer Convolutional Features for Edge Detection
  5. .net core2.0 Memcached.ClientLibrary
  6. Windows下搭建Scala开发环境
  7. Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
  8. c++ stl string char* 向 string 转换的问题
  9. UI自动化测试之iframe切换
  10. 计算机网络原理(04741)第1章:计算机网络概述
  11. 使用OpenSSL库接口,实现AES CBC加密,基于X509 base64编码证书的RSA非对称加密例子
  12. 在yii2应用中,使用imagine库生成分享图实战。
  13. Kubernetes监控:Dashbaord 2.0.0部署之证书创建和设定
  14. 微命令、微指令、微操作
  15. 拼多多如何优化产品排名位置?
  16. 微信小程序 图片验证码展示
  17. 互动媒体技术——《代码本色》习作二:向量
  18. win10查看设备序列号、硬盘序列号、mac地址
  19. EPICS -- autosave模块使用示例
  20. 【神经网络】正向传播和反向传播(结合具体例子)

热门文章

  1. 阿里巴巴集团增持丁丁网
  2. TongWeb部署应用包大小的限制
  3. 基于TCP连接的服务器端为什么需要用两个套接字
  4. Chrome内核浏览器插件之禁用Google地址跳转
  5. 【闲趣】关于INTJ
  6. 写给想创业的朋友,向敢于创业的朋友致敬
  7. 为什么打工,越打越穷?
  8. Java异常捕捉机制
  9. 入坑大法_input不可以前端编辑但是可以后台传值
  10. 如此有爱的二次元游戏,必须让你们都知道