MVC 输出缓存和缓存分析





4.00/5 (1投票)
在本帖中,我们将讨论在 MVC 中缓存输出以及输出缓存属性的最简单方法之一。
引言
MVC 为用户提供了一种在一定时间内缓存任何输出(视图/数据)的方法。此功能也可以在操作级别使用。我们将在接下来的部分中编写一个快速代码来演示这一点。
我们还将创建一些缓存配置文件,并使用它们来缓存不同的部分。这将使缓存策略在未来发生一定程度的变化时更容易处理,而无需重新部署。
现在让我们开始编写代码。
让我们从一个空白的 MVC 应用程序开始
打开 Visual Studio 2013 IDE,然后创建一个新项目,如下所示
选择 ASP.NET Web 应用程序
选择 **空** 模板并选中 **MVC**(以便 MVC 文件夹在代码结构中创建)。单击确定,无需更改任何其他选项。
这将为我们提供一个空白的 MVC 应用程序,我们可以在其中添加此演示所需的代码。
添加代码以查看效果
让我们在控制器文件夹中添加一个 Home 控制器,并在其中添加以下代码:
namespace MVCCache.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 5)]
public string GetHeaderData()
{
return "Header data is returned at " + DateTime.Now.ToString();
}
[OutputCache(Duration = 10)]
public string GetFooterData()
{
return "Footer data is returned at " + DateTime.Now.ToString();
}
}
}
这里我们有三个操作方法
- Index – 返回索引视图。
- GetHeaderData – 返回头部数据。为了测试我们的缓存代码,我们还在其中添加了日期时间。这将告诉我们数据是在何时从服务器获取的。理想情况下,它应该只在头部缓存过期后才去服务器获取数据。
如果您注意到操作方法顶部,我们添加了* [OutputCache(Duration = 5)]*。
这告诉应用程序缓存此数据 5 秒钟,对于在缓存过期前的任何请求,数据将直接从缓存中获取。一旦缓存过期,它将再次从服务器获取数据。
- GetFooterData – 返回页脚数据。为了测试我们的缓存代码,我们还在其中添加了日期时间。这将告诉我们数据是在何时从服务器获取的。理想情况下,它应该只在页脚缓存过期后才去服务器获取数据。
如果您注意到操作方法顶部,我们添加了* [OutputCache(Duration = 10)]*。
这告诉应用程序缓存此数据 10 秒钟,对于在缓存过期前的任何请求,数据将直接从缓存中获取。一旦缓存过期,它将再次从服务器获取数据。
现在,让我们在视图的 Home 文件夹内创建索引视图,并添加如下所述的头部和正文部分:
头部部分代码
此部分仅包含一些类来区分头部和页脚与其他数据。(可以替换为任何其他样式代码)。
<head>
<meta name="viewport" content="width=device-width" />
<title>Main</title>
<style>
header
{
height: 200px;
background: orange;
text-decoration: solid
}
footer
{
height: 200px;
background: green;
text-decoration: solid
}
</style>
</head>
正文部分代码
在这里,头部部分调用“**GetHeaderData**”操作方法,并显示从该方法返回的任何内容。请记住,我们将此数据缓存了五秒钟。
页脚部分只是调用“**GetFooterData**”操作方法,并显示从该方法返回的任何内容。请记住,我们将此数据缓存了 10 秒钟。
在头部和页脚之间,此视图还自行渲染了一些数据,这些数据根本没有缓存。
请注意,所有这些部分都在各自部分的顶部显示数据获取时间。
<head>
<meta name="viewport" content="width=device-width" />
<title>Main</title>
<style>
header
{
height: 200px;
background: orange;
text-decoration: solid
}
footer
{
height: 200px;
background: green;
text-decoration: solid
}
</style>
</head>
测试应用程序
测试应用程序
好的,缓存所需的基本代码现已完成(缓存配置文件代码仍在最后,我们将在最后讨论),所以让我们测试我们创建的应用程序。
现在请记住,我们将头部缓存了五秒钟,页脚缓存了 10 秒钟,而内容根本没有缓存。因此,我们应该预期头部代码每五秒钟会访问服务器获取新数据,在此期间如果收到请求,它将显示来自缓存的数据。同样,页脚代码也应该这样做,因为它缓存了 10 秒钟。
其余内容未缓存,因此,每次刷新时,它都应该访问服务器并获取新数据。
现在让我们运行应用程序,看看它是否如我们预期的那样运行。当我们运行此应用程序时,它将显示一个如下所示的页面
总而言之,我们在此代码中所做的是,我们将网页的两个部分缓存了不同的时间段,并保留了一个部分,其中一部分数据保持实时且未缓存。
缓存分析
此代码中唯一剩下的是使其更易于部署。目前,如果我们想将头部缓存时间从五秒更改为三十秒,我们需要更改代码库,这需要部署。为了避免这种情况,我们可以使用缓存分析。它只是将缓存持续时间设置移到配置中,并为其命名。此缓存配置文件名称可用于代替在控制器中定义持续时间。让我们看看如何为我们已添加的代码添加缓存配置文件。
在项目的 **web.config** 文件中,在 *<system.web>* 部分内添加 caching 部分,如下所示
现在我们准备好了两个缓存配置文件,我们可以使用它们来代替在控制器中定义缓存属性。
让我们按如下方式更改控制器代码:
[OutputCache(Duration = 5)] - [OutputCache(CacheProfile = "HeaderCache")]
[OutputCache(Duration = 10)] [OutputCache(CacheProfile = "FooterCache")]
每当我们想更改头部或页脚的缓存时间时,我们都可以只更改 webconfig 中的持续时间,而无需部署即可生效。