广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NET Core中的Http缓存使用
  • 502
分享到

ASP.NET Core中的Http缓存使用

ASP.NETnetHTTPcoreASP 2022-06-07 22:06:54 502人浏览 独家记忆
摘要

Http响应缓存可减少客户端或代理对WEB服务器发出的请求数。响应缓存还减少了web服务器生成响应所需的工作量。响应缓存由Http请求中的header控制。 而ASP.net

Http
响应缓存可减少客户端或代理对
WEB
服务器发出的请求数。响应缓存还减少了
web
服务器生成响应所需的工作量。响应缓存由
Http
请求中的
header
控制。

ASP.net core
对其都有相应的实现,并不需要了解里面的工作细节,即可对其进行良好的控制。

了解Http缓存

Http
协议中定义了许多缓存,但总体可以分为强缓存和协商缓存两类。

强缓存

强缓存是指缓存命中时,客户端不会向服务器发请求,浏览器

F12
能看到响应状态码为
200
size
from cache
,它的实现有以下几种方式:

Expires - 绝对时间

示例:

Expires:Thu,31 Dec 2037 23:59:59 GMT
,就表示缓存有效期至2037年12月31日,在这之前浏览器都不会向服务器发请求了(除非按
F5
/
Ctrl+F5
刷新)。

Cache-Control - 相对时间/更多控制

绝对时间是一个绝对时间,因为计算时不方便;而且服务端是依据服务器的时间来返回,但客户端却需要依据客户的时间来判断,因此也容易失去控制。

Cache-Control
有以下选项(可以多选):

max-age: 指定一个时间长度,在这个时间段内缓存是有效的,单位是秒(s)。例如设置Cache-Control:max-age=31536000,也就是说缓存有效期为31536000/24/60/60=365天。 s-maxage: 同max-age,覆盖max-age、Expires,但仅适用于共享缓存,在私有缓存中被忽略。 public: 表明响应可以被任何对象(发送请求的客户端、代理服务器等等)缓存。 private: 表明响应只能被单个用户(可能是操作系统用户、浏览器用户)缓存,是非共享的,不能被代理服务器缓存。 no-cache: 强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。(不是字面意思上的不缓存) no-store: 禁止缓存,每次请求都要向服务器重新获取数据。 must-revalidate: 指定如果页面是过期的,则去服务器进行获取。(意思是浏览器在某些情况下,缓存失效后仍可使用老缓存,加了这个头,失效后就必须验证,并不是字面上有没有过期都验证)

其中最有意思的要数

no-cache
must-revalidate
了,因为它们的表现都不是字面意义。

no-cache
并不是字面上的不缓存,而是会一直服务端验证(真实意义很像字面上的
must-revalidate
)。

must-revalidate
是只是为了给浏览器强调,缓存过期后,千万要遵守约定重新验证。

协商缓存

协商缓存是指缓存命中时,服务器返回

Http
状态码为
304
但无内容(
Body
),没命中时返回
200
有内容。

在要精细控制时,协商缓存比强缓存更有用,它有

Last-Modified
ETag
两种。

Last-Modified/If-Modify-Since(对比修改时间)

示例:

服务器:Last-Modified: Sat, 27 Jun 2015 16:48:38 GMT
客户端:If-Modified-Since: Sat, 27 Jun 2015 16:48:38 GMT

ETag/If-None-Match(对比校验码)

服务器:ETag: W/"0a0b8e05663D11:0"
客户端:If-None-Match: W/"0a0b8e05663d11:0"

清缓存要点

F5
刷新时,强缓存失效 按
Ctrl+F5
刷新时 强缓存和协商缓存都失效

ASP.NET Core的Http缓存

ASP.net core
中提供了
ResponseCacheAttribute
来实现缓存,它的定义如下:


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class ResponseCacheAttribute : Attribute, IFilterFactory, IFilterMetadata, iorderedFilter
{
  public ResponseCacheAttribute();
  public string CacheProfileName { get; set; }
  public int Duration { get; set; }
  public bool IsReusable { get; }
  public ResponseCacheLocation Location { get; set; }
  public bool NoStore { get; set; }
  public int Order { get; set; }
  public string VaryByHeader { get; set; }
  public string[] VaryByQueryKeys { get; set; }
}

其中,

ResponseCacheLocation
定义了缓存的位置,是重点:


//   Determines the value for the "Cache-control" header in the response.
public enum ResponseCacheLocation
{
  //   Cached in both proxies and client. Sets "Cache-control" header to "public".
  Any = 0,
  //   Cached only in the client. Sets "Cache-control" header to "private".
  Client = 1,
  //   "Cache-control" and "Pragma" headers are set to "no-cache".
  None = 2
}

注意看源文件中的注释,

Any
表示
Cache-Control: public
Client
表示
Cache-Control: private
None
表示
Cache-Control: no-cache

注意

ResponseCacheLocation
并没有定义将缓存放到服务器的选项。

其中

Duration
表示缓存时间,单位为秒,它将翻译
max-age

另外可以通过

VaryByHeader
VaryByQueryKeys
来配置缓存要不要通过
header
query string
来变化,其中
VaryByHeader
是通过
Http
协议中的
Vary
头来实现的,
VaryByQueryKeys
必须通过
Middleware
来实现。

不要误会,所有

ResponseCacheAttribute
的属性配置都不会在服务端缓存你的响应数据(虽然你可能有这种错觉),它和输出缓存不同,它没有状态,只用来做客户端强缓存。

如果不想缓存,则设置

NoStore = true
,它会设置
cache-control: no-store
,我们知道
no-store
的真实意思是不缓存。一般还会同时设置
Location = ResponseCacheLocation.None
,它会设置
cache-control: no-cache
(真实意思是表示一定会验证)。

注意单独设置

Location = ResponseCacheLocation.None
而不设置
NoStore
并不会有任何效果。

示例1

这是一个很典型的使用示例:


public class HomeController : Controller
{
  [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Client)]
  public IActionResult Data()
  {
    return JSON(DateTime.Now);
  }
}

我定义了

3600
秒的缓存,并且
cache-control
应该为
private
,生成的
Http
缓存头可以通过如下
C#
代码来验证:


using var http = new HttpClient();
var resp1 = await http.GetAsync("https://localhost:55555/home/data");
Console.WriteLine(resp1.Headers.CacheControl.ToString());
Console.WriteLine(await resp1.Content.ReadAsStringAsync());

输入结果如下:

max-age=3600, private
"2020-03-07T21:35:01.5843686+08:00"

另外,

ResponseCacheAttribute
也可以定义在
Controller
级别上,表示整个
Controller
都受到缓存的影响。

CacheProfileName示例

另外,如果需要共用缓存配置,可以使用

CacheProfileName
,将缓存提前定义好,之后直接传入这个定义名即可使用:


.ConfigureServices(s =>
{
  s.AddControllers(o =>
  {
    o.CacheProfiles.Add("3500", new CacheProfile
    {
      Duration = 3500, 
      Location = ResponseCacheLocation.Client,
    });
  });
});

这样我就定义了一个名为

3500
的缓存,稍后在
Controller
中我只需传入
CacheProfileName = 3500
即可:


public class HomeController : Controller
{
  [ResponseCache(CacheProfileName = "3500")]
  public IActionResult Data()
  {
    return json(DateTime.Now);
  }
}

总结

Http
缓存分为强缓存和协商缓存,
ASP.Net Core
提供了便利的
ResponseCacheAttribute
实现了强缓存,还能通过
Profile
来批量配置多个缓存点。

asp.net mvc
并没有提供协商缓存实现,因为这些多半和业务逻辑相关,需要自己写代码。静态文件是特例,
Microsoft.Aspnetcore.StaticFiles
中提供有,因为静态文件的逻辑很清晰。

ASP.net
中的
OutputCacheAttribute
ASP.NET Core
中不复存在,取而代之的是
app/services.AddResponseCaching()
,这些和
Http
协议不相关。

有机会我会具体聊聊这些缓存。

到此这篇关于ASP.NET Core中的Http缓存使用的文章就介绍到这了,更多相关ASP.NET Core Http缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文章:ASP.NET Core中间件计算Http请求时间示例详解Asp.Net Core2.1前后使用HttpClient的两种方式ASP.NET Core针对一个使用HttpClient对象的类编写单元测试详解ASP.NET Core中调整HTTP请求大小的几种方法详解ASP.NET Core Kestrel 中使用 HTTPS (SSL)ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)


--结束END--

本文标题: ASP.NET Core中的Http缓存使用

本文链接: https://www.lsjlt.com/news/30783.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core中的Http缓存使用
    Http响应缓存可减少客户端或代理对web服务器发出的请求数。响应缓存还减少了web服务器生成响应所需的工作量。响应缓存由Http请求中的header控制。 而ASP.NET ...
    99+
    2022-06-07
    ASP.NET net HTTP core ASP
  • ASP.NET Core中使用Redis实现缓存
    目录一、前言二、安装StackExchange.Redis三、添加配置四、Redis帮助类五、添加服务依赖项六、在控制器中使用七、测试一、前言 我们这里以StackExchange....
    99+
    2022-11-13
  • 在 ASP.NET Core 中使用 HTTP 标头传播详情
    目录前言Demo结论前言 我们常用 JWT 令牌用于身份验证,前端一般是在请求中包含 HTTP 标头 Authorization 实现。 但是,当服务间需要互相调...
    99+
    2022-11-13
  • 在ASP.NET Core中怎么使用HTTP标头传播
    这篇文章主要介绍“在ASP.NET Core中怎么使用HTTP标头传播”,在日常操作中,相信很多人在在ASP.NET Core中怎么使用HTTP标头传播问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-30
  • ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求
    今天小编给大家分享一下ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-06-29
  • ASP.NET Core扩展库之Http日志的使用详解
    目录一、开启服务端请求日志 二、开启客户端请求日志 三、示例     最佳实践都告诉我们不要记录请求的详细日志,因为这有安全问题,但在实际开发...
    99+
    2022-11-12
  • ASP.NET Core扩展库之Http请求模拟功能的使用
    目录一、在服务端使用 二、在单元测试中使用 三、示例     如今,完全独立的业务应用几乎不存在,不管是在企业内部微服务之间的调用,还是与外部...
    99+
    2022-11-12
  • ASP.Net Core中的内存和GC机制
    托管代码 在 .NET 中, CLR(Common Language Runtime) 负责提取托管代码并编译成机器语言,然后执行它。在此过程中,CLR 提供自动内存管理、...
    99+
    2022-11-13
  • ASP.NET Core扩展库之Http通用扩展库的使用详解
    目录一、开启服务端请求缓冲 二、请求头传递 三、请求头日志的记录 四、Http消息上的扩展方法 五、HttpClient上的扩展方法     ...
    99+
    2022-11-12
  • ASP.NET Core 中FromServices如何使用
    本篇文章给大家分享的是有关 ASP.NET Core 中FromServices如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。构造函数...
    99+
    2022-10-19
  • ASP.NET Core中使用LazyCache的全过程
    前言 微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持...
    99+
    2022-11-11
  • 如何在ASP.NET Core中使用ViewComponent
    目录前言自定义一个组件ViewComponent特性Taghelper方式Reference前言 在之前的开发过程中,我们对于应用或者说使用一些小的组件,通常使用分布页(parti...
    99+
    2022-11-12
  • 如何在ASP.Net Core中使用Serilog
    目录安装 Serilog使用 Serilog Sink使用 Serilog 替换原生的 Logger记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志...
    99+
    2022-11-12
  • 怎样在ASP.NET Core中使用HttpClientFactory
    本篇内容主要讲解“怎样在ASP.NET Core中使用HttpClientFactory”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎样在ASP.NET Core中使用HttpClientFa...
    99+
    2023-06-14
  • ASP.NET Core中HttpContext详解与使用
    “传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Co...
    99+
    2022-11-12
  • 如何在ASP.NET Core中使用HttpClientFactory
    目录为什么要使用 HttpClientFactory 使用 HttpClientFactory 注入 Controller ASP.Net Core 是一个开源的,跨平台的,轻量级模...
    99+
    2022-11-12
  • 如何在Asp.Net Core中使用Refit
    本篇文章给大家分享的是有关如何在Asp.Net Core中使用Refit,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ASP.NET 是什么ASP.NET 是开源,跨平台,高性...
    99+
    2023-06-07
  • Serilog如何在ASP.Net Core中使用
    本篇文章为大家展示了Serilog如何在ASP.Net Core中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。安装 Serilog使用 Visual Studio 新建 ASP.Net Cor...
    99+
    2023-06-14
  • ASP.NET Core中间件如何使用
    今天小编给大家分享一下ASP.NET Core中间件如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言...
    99+
    2023-06-29
  • 在ASP.Net Core中使用Lamar的全过程
    前言 ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作