.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

相关推荐
zhangrelay6 小时前
操作系统全解析:Windows、macOS与Linux的深度对比与选择指南(AI)
linux·笔记·学习
灰太狼大王灬6 小时前
Node.js 本地服务部署、常驻及调用完整笔记
笔记·node.js
聪明的笨猪猪6 小时前
Java SE “面向对象”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪7 小时前
Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
岑梓铭8 小时前
《考研408数据结构》第三章(3.1 栈)复习笔记
数据结构·笔记·考研·408
丶Darling.8 小时前
26考研 | 王道 | 计算机组成原理 | 二、数据的表示和运算
笔记·学习·计算机组成原理
丰锋ff8 小时前
2017 年真题配套词汇单词笔记(考研真相)
笔记
丰锋ff8 小时前
2009 年真题配套词汇单词笔记(考研真相)
笔记·学习·考研
聪明的笨猪猪10 小时前
Java SE “泛型 + 注解 + 反射”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
智者知已应修善业11 小时前
【51单片机计时器1中断的60秒数码管倒计时】2023-1-23
c语言·经验分享·笔记·嵌入式硬件·算法·51单片机