手记

如何在 ASP.Net Core 中使用 Response 缓存中间件

现在越来越多的开发人员选择 ASP.Net Core 构建高性能,现代化web程序,并跑在 Windows,Linux 和 MacOS 上,而高性能的一大课题就是缓存,虽然 ASP.Net Core 中并没有内建缓存对象,但可以利用 Nuget 的外接扩展实现如下三种缓存方式。

  • In-memory caching
  • distributed caching
  • response caching

在前面的文章中讨论过如何在 ASP.Net Core 中实现内存缓存 和 分布式缓存,在这篇文章中,我将会解释 Response Cache 及它的好处,然后再来看一下如何在 ASP.Net Core 中集成 response cache 中间件。

Response Cache

Response Cache 原理就是在 Http Response Header 中设置一些缓存相关的参数实现对 Response 的缓存,在 Header 中可以指定是否对所有的 Request 请求或者一些 可选的 Request 请求缓存 Resposne,指的注意的是,它不是 output 缓存,也就表明 ASP.Net Core 不会将 response 缓存在 webserver 中。

Response Cache 实际上是一种更好,更方便扩展的缓存机制,它通过在 Http Header 中设置一些缓存相关的响应头来通知浏览器缓存指定的内容,这就规避了 client 对 webserver 大量本不需要的请求,后续的请求都是由本地的 client cache 中直接返回,没有了双方的往返时间耗费。

配置 Response Cache

要想使用 Response Cache,需要将其注入到 ServiceCollection 容器中,代码如下:


public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching();
    services.AddMvc();
}

注入到容器之后,接下来使用 UseResponseCaching() 将其添加到 请求处理管道 中,如下代码所示:


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //Other code
    app.UseResponseCaching();   
}

Response缓存的配置项

Response缓存中间件提供了三个可选项实现一定程序的自定义化,列举如下:

  • SizeLimit

用于指定 response cache 的最大缓存尺寸,默认是 100 MB。

  • UseCaseSensitivePaths

用于指定 response cache 是否对缓存key区分大小写。

  • MaximumBodySize

用于指定单个缓存项的最大尺寸,默认是 65MB。

下面的代码片段展示了如何使用这三个选项进行配置。


public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching(options =>
     {
          options.UseCaseSensitivePaths = true;
          options.MaximumBodySize = 1024;
     });
    services.AddMvc();
}

使用 ResponseCache 特性

到此为止,中间件已经配置好了,现在可以在 Action 方法上使用 [ResponseCache] 特性了,当然还可以在特性的构造函数中使用如下一些选项。

  • Duration

用于指定 Response Cache 的存活时间。

  • Location

用于指定 Response Cache 缓存的位置,有:Any,Client,None。

  • NoStore

用于指定是否存储数据在客户端。

  • CacheProfileName

用于指定 cache profile 的名字。

  • VaryByHeader

用于指定Vary响应头。

  • VaryByQueryKeys

基于 querystring 参数来实现缓存。

接下来在 Controller.Index 方法上使用 ResponseCache 特性,让输出内容缓存 30s,如下代码所示:


    public class HomeController : Controller
    {
        [ResponseCache(Duration = 30)]
        public IActionResult Index()
        {
            ViewData["Message"] = "The current time is:" + DateTime.Now.ToString();
            return View();
        }
    }

下面是 Index.cs 代码:


@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <h1> @ViewData["Message"]</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

接下来看一下 Http响应头 是否做了一些变更。

从上图中的 Cache-Control: public,max-age=30 可以看出, Response 被缓存了 30s,不过要注意的是, response 缓存中间件 只缓存 http 200 的服务端响应,意味着非 200 或者一些错误页面将不会得到缓存。

**更多高质量干货:参见我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate **

1人推荐
随时随地看视频
慕课网APP