本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。 由于个人技术水平和英文水平也是有限的,因此错误在所难免,希望大家多多留言指正。
系列导航 Asp.net mvc 知多少(一)
Asp.net mvc 知多少(八) Asp.net mvc 知多少(九)
Q87. 什么是caching(缓存)以及什么时候使用缓存? Ans. Caching 是高性能web应用程序的一个很重要的方面。Caching是一种提高web应用程序性能的高效方法。Caching 提供了存储经常访问的数据以及重用这些数据的一种方式。 何时使用缓存:
VaryByCustom
方法去缓存基于自定义的请求类型(比如cookie,role,theme,browser等等)的多个版本的内容;Q88. 缓存的好处是什么? Ans. 主要有以下几点:
Q89. 什么是output caching(输出缓存)?
Ans. OutputCache
过滤器允许你缓存一个action的输出数据。默认该过滤器只缓存60s。60s后,ASP.NET MVC会重新执行action并再次缓存输出。
class HomeController : Controller
{
[OutputCache(Duration = 20, VaryByParam = "none")]
public ActionResult Index()
{
ViewBag.Message = DateTime.Now.ToString();
return View();
}
}
Index()
action的输出将会被缓存20s。
Output Caching Location(输出缓存的路径)
默认内容被缓存在3个地方:web server(web 服务器),proxy server(代理服务器),user's browser(用户浏览器)。
你可以通过修改OutputCache
特性的Location
参数来控制内容缓存的地方。Location
可以设置为:Any
,Client
,Downstream
, Server
,None
,ServerAndClient
。
默认,Location
参数设置为Any
可以适用于大部分场景。但是有些时候你可能需要对缓存数据有更多的控制。
Q90. ASP.NET MVC中什么是Donut caching 和 Donut hole caching?
Ans. Donut caching 缓存除了部分内容以外的整个页面。在介绍Donut caching之前,我们使用Output Caching(输出缓存)来缓存整个页面。
何时使用Donut caching?
假设你有一个web应用程序中有一些页面,比如主页,主页展示的内容对所有用户来说都是一样的除了用户的登陆信息比如用户名。如果你想通过OutputCache(VaryByParam=UserID)
来为所有用户缓存主页,那么整个页面将会为每个用户分别缓存。这将不是一个好的实践,因为如果同时又1000个登陆的用户,就将会缓存1000个网页。
为了解决这个问题,Donut Caching 被引入,它为所有用户缓存一份整个页面除了部分动态内容。这个动态部分实际上类似于缓存内容上的一个洞(像甜甜圈)。 Donut caching 非常适用于对大部分内容很少改变但又有部分内容动态改变的页面进行缓存。 Donut Hole caching Donut Hole Caching和Donut Caching刚好相反,它用来缓存页面中的一小部分。
何时使用Donut Hole caching? 假设你有一个web应用程序,它需要在每个页面里显示产品列表,那么这时以HTML的形式缓存一个产品列表就是很需要的了,Donut Hole Caching就是设计来处理这种情况。 ASP.NET MVC 通知在Child Action上使用OutputCache来支持Donut Hole caching:
class HomeController : Controller
{
[ChildActionOnly]
[OutputCache(Duration = 60)]
public ActionResult CategoriesList()
{
// Get categories list from the database and
// pass it to the child view
ViewBag.Categories = GetCategories();
return View();
}
}