ASP.Net中的缓存特性OutPutCache

本文介绍ASP.NET MVC中使用OutputCache特性和配置文件来缓存控制器操作输出的方法,包括缓存位置、个性化内容处理及缓存配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

clip_image002

如果多次调用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

clip_image004

Figure 3 – The /Movies/Details view

clip_image006

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配置文件中定义缓存配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值