ASP.NET MVC - 缓存

ASP.NET MVC - 缓存 首页 / ASP.Net MVC入门教程 / ASP.NET MVC - 缓存

在本章中,我们将重点介绍最常见的ASP.NET技术之一(如缓存),以提高应用程序的性能,缓存意味着将某些东西存储在内存中,这些东西经常被使用以提供更好的性能,我们将看到如何利用输出缓存来显着提高ASP.NET MVC应用程序的性能。

在ASP.NET MVC中,您可以应用一个OutputCache筛选器属性,这与Web表单中的输出缓存相同,通过输出缓存,您可以缓存控制器操作返回的内容。

无涯教程网

输出缓存基本上使您可以将特定控制器的输出存储在内存中,因此,将来从该缓存输出中返回对该控制器中的相同Action的任何请求。这样,不必每次调用同一控制器Action时都生成相同的内容。

为什么要缓存?

我们需要在许多不同的场景中进行缓存,以提高应用程序的性能。如,您有一个ASP.NET MVC应用程序,该应用程序显示员工列表。现在,每当用户每次调用控制器操作时通过执行数据库查询从数据库中检索这些记录时,它将返回Index视图。

因此,您可以利用输出缓存来避免每次用户调用相同的控制器操作时都执行数据库查询,在这种情况下,将从缓存中检索视图,而不是从控制器操作中重新生成视图。

通过缓存,您可以避免在服务器上执行多余的工作。

让我们看一下我们项目中缓存的简单示例。

[OutputCache(Duration = 60)]
public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

如您所见,我们在EmployeeController的index操作上添加了"OutputCache"属性,现在要了解这个概念,让我们在调试器模式下运行此应用程序,并在Index action方法中插入一个断点。

OutputCache

指定以下URL http://localhost:63004/employee ,然后按回车,您将看到在Index操作方法中命中了断点。

Breakpoint is Hit

按" F5"按钮继续,您将在视图中看到从数据库中检索到的员工列表。

链接:https://www.learnfk.comhttps://www.learnfk.com/asp.net_mvc/asp.net-mvc-caching.html

来源:LearnFk无涯教程网

List of Employees Retrieved

在60秒内再次刷新浏览器,您会发现这次没有找到断点,这是因为我们使用了持续时间为几秒的输出缓存,因此它将缓存此输出60秒钟,并且当您刷新浏览器时,它将从缓存中获取输出,并且不会从数据库服务器加载内容。

除了持续时间参数外,还有其他设置选项可与输出缓存一起使用,这些设置不仅适用于MVC框架,而且还继承自ASP.Net Caching。

改变输出缓存

在某些情况下,您可能需要不同的缓存版本,如,当创建详细信息页面时,然后单击详细的链接时,您将获得所选员工的详细信息。

但是首先我们需要创建细节视图。为此,在EmployeeController上的Details操作方法上单击鼠标右键,然后选择Add View…。

Create Detail View

您将看到默认情况下选择了Details名称。现在,从"Template"下拉列表中选择"Details",从"Model"类下拉列表中选择"Employee"。

Template Dropdown

点击"Add"继续,您将看到Details.cshtml。

@model MVCSimpleApp.Models.Employee
@{
   Layout = null;
}

<!DOCTYPE html>
<html>
   <head>
      <meta name = "viewport" content = "width=device-width" />
      <title>Details</title>
   </head>
	
   <body>
      <div>
         <h4>Employee</h4>
         <hr />
         <dl class = "dl-horizontal">
            <dt>
               @Html.DisplayNameFor(model => model.Name)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.Name)
            </dd>
				
            <dt>
               @Html.DisplayNameFor(model => model.JoiningDate)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.JoiningDate)
            </dd>
				
            <dt>
               @Html.DisplayNameFor(model => model.Age)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.Age)
            </dd>
				
         </dl>
      </div>
		
      <p>
         @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
         @Html.ActionLink("Back to List", "Index")
      </p>
		
   </body>
</html>

您可以利用[OutputCache]属性的VaryByParam属性,此属性使您可以在表单参数或查询字符串参数变化时为同一内容创建不同的缓存版本,以下是"Details"操作的实现。

//GET: Employee/Details/5
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]

public ActionResult Details(int id){
   var employee = db.Employees.SingleOrDefault(e => e.ID == id);
   return View(employee);
}

编译并执行上述代码后,通过指定URL http://localhost:63004/employee 将收到以下输出。

Create New

单击任何链接的"Details"链接,您将看到该特定员工的详细信息视图。

Particular Employee Details

Details()操作包含值为" Id"的VaryByParam属性,将Id参数的不同值传递到控制器操作时,将生成"Details"视图的不同缓存版本。

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

缓存配置文件

您可以在web.config文件中创建缓存配置文件,它是通过修改[OutputCache]属性来配置输出缓存属性的替代方法。

通过在web.config文件中创建缓存配置文件,让我们看一个简单的缓存配置文件示例。<caching>部分必须出现在<system.web>部分中。

<caching>
   <outputCacheSettings>
      <outputCacheProfiles>
         <add name = "Cache10Min" duration = "600" varyByParam = "none"/>
      </outputCacheProfiles>
   </outputCacheSettings>
</caching>

您可以使用[OutputCache]属性将Cache10Min配置文件应用于控制器操作,如下所示。

[OutputCache(CacheProfile = "Cache10Min")]

public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

运行此应用程序并指定以下URL http://localhost:63004/employee

Invoke Index Action

如果您如上所示调用Index()操作,则将返回10分钟的相同时间。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Linux性能优化实战 -〔倪朋飞〕

Elasticsearch核心技术与实战 -〔阮一鸣〕

分布式数据库30讲 -〔王磊〕

体验设计案例课 -〔炒炒〕

PyTorch深度学习实战 -〔方远〕

Spring Cloud 微服务项目实战 -〔姚秋辰(姚半仙)〕

手把手带你写一个MiniSpring -〔郭屹〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕

后端工程师的高阶面经 -〔邓明〕

好记忆不如烂笔头。留下您的足迹吧 :)