当前位置: 首页 > article >正文

.Net Core笔记知识点(跨域、缓存)

设置前端跨域配置示例:

builder.Services.AddCors(option => {

    option.AddDefaultPolicy(policy => {
        policy.WithOrigins(originUrls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
    });

});

var app = builder.Build();

app.UseCors();

【客户端缓存】接口缓存

对需要设置缓存的控制器加上ResponseCacheAttribute属性,Asp.Net Core会自动添加cache-control报文头,效果如下:20秒内的二次请求将直接获取头第一次的返回的值

 [ResponseCache(Duration =20)]
 [HttpGet("api/[controller]/[action]")]
 public IActionResult GetModel()
 {
  

     return Json();
 }

【服务器端缓存】响应缓存中间件

用法:在app.MapController之前加上app.UseReonseCaching()。确保app.UseCors写到app.UseReonseCaching()前。

注:不使用app.UseReonseCaching()时,不同浏览器请求到的是不同的缓存;启用后,请求到的是同一缓存。

如果浏览器禁用缓存,这个缓存机制是无法生效的,客户端缓存与服务器端缓存都无法生效

缺陷:无法应对恶意请求给服务器带来的压力(使用无缓存请求);有限制:只能响应状态码200的Get或者HEAD响应,报文头中不能含有Authoration、Set-Cookies

【内存缓存】

用法:builder.service.AddMemoryCache();注入IMemoryCache接口

private readonly IMemoryCache _memoryCache;

public TestController(IMemoryCache memoryCache)
{
    _memoryCache = memoryCache;
}

[ResponseCache(Duration = 20)]
[HttpGet]
public IActionResult GetModel()
{
     var data = _memoryCache.GetOrCreateAsync<LoginDto>("loginData", async (e) =>
     {

     //获取不到时,从回调方法中获取并设置缓存
     var model = new LoginDto();

     //设置缓存策略,绝对过期机制,10分钟后过期
     e.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);

     //滑动过期机制,在缓存生效前,只要请求数据,就会重置过期时间
     e.SlidingExpiration = TimeSpan.FromMinutes(10);

     return model;
     });

    return Json(new { code = 0, msg = "" });
}

绝对过期机制和滑动过期机制可以一起混合使用,绝对过期时间需要长于滑动过期时间,有利于数据刷新。

【缓存穿透】

恶意请求无效数据,导致缓存机制中请求数据库访问变多,造成服务器压力变大。

方案1:使用GetOrCreateAsync,将返回的null值也作为缓存数据。

【缓存雪崩】

缓存项集中过期导致服务器访问压力过大

方案1:在基础过期时间之上,再加上随机过期时间。

【分布式缓存】

为避免服务器集群部署时分别请求服务器再缓存数据到内存,会造成服务器压力过大。

方案1:引入缓存服务器,集群部署的服务器直接请求缓存服务器。

.Net Core 提供统一的分布式缓存服务器的操作接口IDistributedCache,缓存类型为byte[],需要进行类型转换。

Nuget:Microsoft.Extensions.Caching.StackExchangeRedis

builder.Services.AddStackExchangeRedisCache


http://www.kler.cn/a/532132.html

相关文章:

  • Spring PropertyPlaceholderConfigurer多配置问题
  • 交叉验证、精确率、召回率
  • Java知识速记:Lambda表达式
  • Spring Boot 2 快速教程:WebFlux处理流程(五)
  • 新月军事战略分析系统使用手册
  • 电控三周速成计划参考
  • 【HTML性能优化】提升网站加载速度:GZIP、懒加载与资源合并
  • I-Wire单总线通信
  • 蓝桥杯备考:前缀和算法之最大子段和
  • Haskell语言的测试开发
  • 登录认证(6):拦截器:Interceptor
  • 进程间的数据桥梁:`multiprocessing.Queue` 的应用
  • MATLAB中extractBefore函数用法
  • 解锁C/C++:链表数据结构的奇幻之旅
  • Docker入门篇(Docker基础概念与Linux安装教程)
  • 课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究
  • 大模型系列21-AI聊天机器人
  • 生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)
  • TFTP 介绍
  • Rust 语言入门
  • Linux系统编程:环境变量
  • Qt中的UIC、MOC、RCC宏定义说明
  • 半导体器件与物理篇5 mosfet及相关器件
  • 狗狗睡觉打呼噜正常吗?
  • 《海丰县蔡氏简介》--海丰县蔡姓宗支源流及始迁祖概述--海丰县各乡镇简介
  • VM虚拟机下macOS中的无法打开身份不明开发者的文件