ASP.NET MVC - 缓存

在本章中,我们将重点介绍一种最常见的ASP.NET技术,如缓存,以提高应用程序的性能.缓存意味着将内容存储在经常使用的内存中以提供更好的性能.我们将看到如何通过利用输出缓存来显着提高ASP.NET MVC应用程序的性能.

在ASP.NET MVC中,有一个OutputCache过滤器属性,你可以应用,这与Web表单中的输出缓存概念相同.输出缓存使您可以缓存控制器操作返回的内容.

输出缓存基本上允许您将特定控制器的输出存储在内存中.因此,将从缓存的结果返回将在该控制器中执行相同操作的任何未来请求.这样,每次调用相同的控制器操作时都不需要生成相同的内容.

为什么要缓存?

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

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

缓存使您可以避免在服务器上执行冗余工作.

让我们看看我们项目中一个简单的缓存示例.

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


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

OutputCache

指定以下URL http://localhost:63004/employee ,然后按"Enter".您将看到断点在Index操作方法中被命中.

Breakpoint is Hit

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

检索到的员工列表

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

In除了duration参数,还有其他设置选项,您可以使用输出缓存.这些设置不仅适用于MVC框架,而且还继承自ASP.Net缓存.

改变输出缓存

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

但首先我们需要创建详细视图.为此,右键单击EmployeeController中的Details操作方法,然后选择Add View ...

Create详细信息视图

默认情况下,您将看到详细信息名称.现在从模板下拉列表中选择详细信息,从模型类下拉列表中选择员工.

模板下拉列表

点击"添加"继续,你会看到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属性.通过此属性,您可以在表单参数或查询字符串参数变化时创建相同内容的不同缓存版本.以下是详细信息操作的实现.

// 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

点击任何链接的详细信息链接,您将看到该特定员工的详细信息视图.

Particular Employee Details

Details()操作包括值为"Id"的VaryByParam属性.当Id参数的不同值传递给控制器操作时,将生成详细信息视图的不同缓存版本.

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

缓存配置文件

您可以在以下位置创建缓存配置文件web.config文件.它是通过修改[OutputCache]属性的属性来配置输出缓存属性的替代方法.它提供了以下几个重要优点:

  • 控制控制器操作如何在一个中心位置缓存内容./p>

  • 创建一个缓存配置文件并将配置文件应用于多个控制器或控制器操作.

  • 修改Web配置文件而不重新编译应用程序.

  • 禁用已部署到生产环境的应用程序的缓存.

让我们通过在web.config文件中创建缓存配置文件来查看缓存配置文件的简单示例. <缓存> section必须出现在< system.web>内部分.

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

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

[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

调用索引操作

如果调用Index()操作,如图所示然后同一时间将返回10分钟.