首页 > 其他分享 >.net webapi 客户端缓存 服务端缓存

.net webapi 客户端缓存 服务端缓存

时间:2023-04-06 21:46:40浏览次数:47  
标签:webapi Control 缓存 Cache 中间件 响应 标头 net

客户端缓存 - ResponseCacheAttribute

通过设置HTTP的响应头 Cache-Control 来完成页面存储到浏览器缓存中,如果请求在缓存有效期间就直接从浏览器缓存中取出数据。

只需要在接口上方添加ResponseCacheAttribute 特性即可设置客户端缓存。
ResponseCacheAttribute 可应用于:

Razor 页面处理程序(类) – 特性不能应用于处理程序方法。
MVC 控制器(类)。
MVC 操作(方法) – 方法级特性覆盖类级特性中指定的设置。

[ResponseCache] 参数

  • Duration 设置缓存的存储时间(以秒为单位)。设置“Cache-control”中的“max-age”。
  • Location
    • Any 缓存在代理和客户端。设置“Cache-control”标题为“public”。
      ** Client 只缓存在客户端。设置“Cache-control”标题为“private”。
    • None 每次有请求发出时,缓存会将请求发到服务器 ,服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回304),则缓存才使用本地缓存副本。 报头设置为“no-cache”。
  • NoStore 缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。
  • VaryByHeader 使用vary头有利于内容服务的动态多样性。例如,使用Vary: User-Agent头,缓存服务器需要通过UA判断是否使用缓存的页面。
  • VaryByQueryKeys 可以按照相同页面,不同的参数进行相应的存储
  • CacheProfileName 设置缓存配置文件的值,可以通过设置不同的缓存参数
  1. 添加配置

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews(options =>
            {
                options.CacheProfiles.Add("default", new CacheProfile
                {
                    Duration = 60
                });

                options.CacheProfiles.Add("test", new CacheProfile
                {
                    Duration = 30
                });
            });
        }


  1. 绑定指定的缓存配置

    [ResponseCache(CacheProfileName = "default")]
    public IActionResult Index()
    {
         return View();
   }


服务端缓存

  1. 配置
    | MaximumBodySize | 响应正文的最大可缓存大小(以字节为单位)。 默认值为 64 * 1024 * 1024 (64 MB)。 |
    | --------------------- | ------------------------------------------------------ |
    | SizeLimit | 响应缓存中间件的大小限制(以字节为单位)。 默认值为 100 * 1024 * 1024 (100 MB)。 |
    | UseCaseSensitivePaths | 确定是否将响应缓存在区分大小写的路径上。 默认值是 false。 |
        public void ConfigureServices(IServiceCollection services)
        {
              services.AddResponseCaching(options =>
            {
                options.UseCaseSensitivePaths = false;
                options.MaximumBodySize = 1024;
                options.SizeLimit = 100 * 1024*1024;
            });
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCaching();
        }
        

  1. 使用
 [ResponseCache(Duration = 30, VaryByQueryKeys = new[] { "q" })]
        public IActionResult Index(int q)
        {
            _logger.LogWarning($"我是一个路径:{HttpContext.Request.Host}");
            return View(model:DateTime.Now.ToString());
        }

ResponseCache中间件使用的 HTTP 标头

响应头 描述
Authorization 如果标头存在,则不会缓存。
Cache-Control 中间件仅考虑用 public 缓存指令标记的缓存响应。
Pragma 请求中的 Pragma: no-cache 标头将产生与 Cache-Control: no-cache相同的效果。 如果存在此标头,则由 Cache-Control 标头中的相关指令重写。 考虑向后兼容 HTTP/1.0。
Set-Cookie 如果标头存在,则不会缓存响应。 请求处理管道中设置一个或多个 cookie 的任何中间件会阻止响应缓存中间件缓存响应(例如,基于 cookie 的 TempData 提供程序)。
Vary Vary 标头用于根据另一个标头改变缓存的响应。 例如,通过编码来缓存响应,包括 Vary: Accept-Encoding 响应头,该响应头将缓存标头为 Accept-Encoding: gzip 和 Accept-Encoding: text/plain 的请求的响应。 永远不会存储响应头值为 * 的响应。
Expires 除非被其他 Cache-Control 标头重写,否则不会存储或检索此响应头过时的响应。
If-None-Match 如果值不为 *,响应的 ETag 与提供的任何值都不匹配,则将从缓存中提供完整响应。 否则,将提供304(未修改)响应。
If-Modified-Since 如果 If-None-Match 标头不存在,则在缓存的响应日期比提供的值更新时,将从缓存中提供完整响应。 否则,将提供304-未修改响应
Date 从缓存提供时,如果未在原始响应中提供,则中间件会设置 Date 标头。
Content-Length 从缓存提供时,如果未在原始响应中提供,则中间件会设置 Content-Length 标头。
Age 忽略原始响应中发送的 Age 标头。 中间件在为缓存的响应提供服务时计算一个新值。

缓存条件

请求必须导致服务器响应,状态代码为200(正常)。
请求方法必须为 GET 或 HEAD。
在 Startup.Configure中,响应缓存中间件必须置于需要缓存的中间件之前。
Authorization 标头不得存在。
Cache-Control 标头参数必须是有效的,并且响应必须标记为 "public" 且未标记为 "private"。
如果 Cache-Control 标头不存在,则 Pragma: no-cache 标头不得存在,因为 Cache-Control 标头在存在时将覆盖 Pragma 标头。
Set-Cookie 标头不得存在。
Vary 标头参数必须有效且不等于 *。
Content-Length 标头值(如果已设置)必须与响应正文的大小匹配。
不使用 IHttpSendFileFeature。
Expires 标头和 max-age 和 s-maxage 缓存指令指定的响应不能过时。
响应缓冲必须成功。 响应的大小必须小于配置的或默认 SizeLimit。 响应的正文大小必须小于配置的或默认的 MaximumBodySize。
"请求" 或 "响应" 标头字段中不得存在 "no-store" 指令。

[参考]
ASP.NET Core ResponseCache进行缓存操作

标签:webapi,Control,缓存,Cache,中间件,响应,标头,net
From: https://www.cnblogs.com/ives/p/17294302.html

相关文章

  • Spring Cache使用方式——不用默认,使用redis进行缓存
    在SpringBoot项目中使用SpringCache的操作步骤(使用redis缓存技术)1、导入Maven坐标spring-boot-starter-data-redis、sping-boot-starter-cache2、配置application.ymlspring:cache:redis:time-to-live:1800000#设置缓存......
  • Visual Studio 2022 不支持 .NET Framework 4.5 项目的解决办法
    概述升级到VisualStudio 2022后,打开速度快了很多,开发体验也舒服很多。只是使用过程中遇到了一个比较尴尬的问题:默认VisualStudio2022不再支持安装.NETFramework4.5组件,如下图所示:选择组件里面已经不能选择4.5/4.0的框架了。此时如果打开基于.NETFramework4.5......
  • c#.net怎么实现web端上传超大文件
    ​ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。ASP.NET页面设计:TextBox和Button按钮。​编辑TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实......
  • WinCE5.0下实现透明背景按钮(.net C#) 个人实验
    参考了WinCE5.0下实现透明背景按钮(.netC#)这篇文章后,本着不模仿的态度去做,结果发现还是原先作者的思路比较好,自己的做法虽然比较简单当时图片得做很多张,效果其实也差不多,而且可维护性并不强,先把我自己做的贴出来。希望自己多敲敲,能找出更简单的方案来目录试图:效果: 直接贴代码:us......
  • memcachaed内存缓存优化
    ①使用场景分类展示(当然只要是短期内不频繁更换的都可以用。。。只要你内存够)②安装方法推荐网址:http://www.lai18.com/content/627794.html③操作方法$mencache=newMemcache();$host='xx.x.xxx.xx'; $port='11211';  //默认端口设置:$memcache->set('class_name','tes......
  • 缓存菜品数据
    实现思路:前面已经实现了移动端菜品查看功能,对应的服务端方法为DishController中的list方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能具体的实......
  • PDM——发动机PDM报错“Windchill 只支持标准模式下的 Internet Explorer 浏览器。请
     解决办法:通过IE8访问WindchillPDMLink10.0,出现警告提示"Windchill只支持标准模式下的浏览器".说明:详细警告提示如下注意:检测到不支持的浏览器模式。Windchill只支持标准模式下的InternetExplorer浏览器。请联系系统管理员帮助您设置浏览器。适用于 WindchillPDM......
  • kubernetes ConfigMap只挂载一个文件
    1.概述挂载一整个目录的方式详见<<kubernetesConfigMap的使用>>这里特别说明如何挂载目录和挂载一个文件详见官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/2.环境2.1.配置文件目录/var/app/mage-go-device/conf/......
  • 2023年成都.NET线下技术沙龙来了!大咖分享,报名从速
    MASA技术团队来成都啦!我们联合了成都.NET俱乐部,将在成都市举办一场.NET线下技术沙龙,为.NET开发者创造一次交流学习的契机,我们邀请到的几位技术大咖,将会围绕各自的主题向大家分享他们的技术心得。本场沙龙名额有限,以报名优先为准。时间2023年4月15日13:30-17:30地址四川省成......
  • Kubernetes 集群监控 controller-manager & scheduler 组件
    一、问题描述在上篇Kubernetes集群监控kube-prometheus部署我们实现kube-prometheus的安装,我们可以看到监控指标大部分的配置都是正常的,只有两个没有管理到对应的监控目标,比如kube-controller-manager和kube-scheduler这两个系统组件。没有监控目标❝备注:controller-man......